可以使用lambda来就地更改List的值(不创建新列表)吗?

根据StackOverflow-On Topic ,这是一个特定的编程问题,一个软件算法,关于程序员常用的软件工具,它是一个实用的,可回答的问题,是软件开发所特有的。

我试图确定在即将发布的Java 8中使用新的lambdasfunction更改List所有值的正确方法,而不创建**new** List

这适用于调用者传入List并需要应用函数将所有内容更改为新值的时间。 例如, Collections.sort(list)的方式就地更改列表。

给定此转换函数和此开始列表的最简单方法是将函数应用于原始列表中的所有值而不创建新列表?

 String function(String s){ return s.toUppercase(); // or something else more complex } List 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 list = Arrays.asList("Bob", "Steve", "Jim", "Arbby"); list.replaceAll(String::toUpperCase); 

使用流行的库Guava,您可以在列表上创建一个计算视图,该视图不会为新数组分配内存,即:

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

@StuartMarks提出了一个更好的解决方案,但是,我留下了这个答案,因为它允许更改集合的generics类型。


另一个选择是声明一个静态方法,如mutate ,它将list和lambda作为参数,并将其作为静态方法导入,即:

 mutate(strings, String::toUpperCase); 

mutate一个可能的实现:

 @SuppressWarnings({ “未选中”})
 public static List mutate(列表列表,函数函数){
    列出objList = list;

     for(int i = 0; i 

你似乎忽略了forEach ,它可以用来改变List的元素。 当然,这并不完全涵盖您的用例 – 如果您的元素是不可变的或者您想要完全替换它们将无济于事。 [编辑:下一句话与流有关,而不是与问题中指定的集合有关]有一个很好的理由说明你不能做这些操作:它们不是平行友好的(这实际上也适用于forEach )和Stream API强烈反对使用仅序列操作。