Ответ 1
List<String> list = Arrays.asList("Bob", "Steve", "Jim", "Arbby");
list.replaceAll(String::toUpperCase);
Согласно 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(..)
? List<String> list = Arrays.asList("Bob", "Steve", "Jim", "Arbby");
list.replaceAll(String::toUpperCase);
С помощью популярной библиотеки 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
Кажется, вы упустили forEach
, который может использоваться для мутаций элементов List
. Конечно, это не распространяется на ваш вариант использования полностью: это не поможет, если ваши элементы неизменяемы или вы хотите полностью их заменить. [edit: следующее предложение относится к потокам, а не к коллекциям, указанным в вопросе]. Существует веская причина, по которой вы не можете выполнять эти операции: они не являются дружественными к параллельному (это также относится и к forEach
). и API-интерфейс Stream настоятельно запрещает использование последовательных операций.