是否可以使用 lambda 就地更改列表的值(无需创建新列表)?

2022-09-02 20:28:02

我正在尝试确定在即将发布的Java 8中使用新的lambs功能更改所有值的正确方法,而无需创建.List**new** List

这与调用方传入 a 并且需要应用函数以将所有内容更改为新值时有关。例如,就地更改列表的方式。ListCollections.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(..)

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

答案 2

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

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

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


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


mutate(strings, String::toUpperCase);

以下各项的可能实现:mutate

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

    for (int i = 0; i