Подтвердить что ты не робот

Можно ли использовать lambda для изменения значений List на месте (без создания нового списка)?

Согласно StackOverflow-On Topic, это специфическая проблема программирования, программный алгоритм, программные инструменты, обычно используемые программистами, и это практичный, которые уникальны для разработки программного обеспечения.

...

Я пытаюсь определить правильный способ изменения всех значений в List с использованием новой функции lambdas в предстоящем выпуске Java 8 без создания **new** List.

Это относится к временам, когда a List передается вызывающим абонентом и ему нужно иметь функцию, применяемую для изменения всего содержимого на новое значение. Например, способ Collections.sort(list) изменяет список на месте.

Как проще всего передать эту функцию преобразования и этот начальный список применить эту функцию ко всем значениям в исходном списке без создания нового списка?

String function(String s){ 
    return s.toUppercase(); // or something else more complex
}

List<String> list = Arrays.asList("Bob", "Steve", "Jim", "Arbby");

Обычный способ применения изменения ко всем значениям на месте был следующим:

for (int i = 0; i < list.size(); i++) {
    list.set(i, function( list.get(i) );
}

Предлагаются ли lambdas и Java 8:

  • более простой и выразительный способ?
  • способ сделать это, не настраивая все леса цикла for(..)?
4b9b3361

Ответ 1

    List<String> list = Arrays.asList("Bob", "Steve", "Jim", "Arbby");
    list.replaceAll(String::toUpperCase);

Ответ 2

С помощью популярной библиотеки Guava вы можете создать вычислительное представление в списке, который не выделяет память для нового массива, т.е.

upperCaseStrings = Lists.transform(strings, String::toUpperCase)

<ы > Лучшее решение предлагается @StuartMarks, однако я оставляю этот ответ, поскольку он позволяет также изменять общий тип коллекции.


Другой вариант - объявить статический метод, например mutate, который принимает список и лямбда в качестве параметра, и импортирует его как статический метод i.e.:


mutate(strings, String::toUpperCase);

Возможная реализация для mutate:

@SuppressWarnings({"unchecked"})
public static  List mutate(List list, Function function) {
    List objList = list;

    for (int i = 0; i 

Ответ 3

Кажется, вы упустили forEach, который может использоваться для мутаций элементов List. Конечно, это не распространяется на ваш вариант использования полностью: это не поможет, если ваши элементы неизменяемы или вы хотите полностью их заменить. [edit: следующее предложение относится к потокам, а не к коллекциям, указанным в вопросе]. Существует веская причина, по которой вы не можете выполнять эти операции: они не являются дружественными к параллельному (это также относится и к forEach). и API-интерфейс Stream настоятельно запрещает использование последовательных операций.