如何使用Stream API更新Java 8中List中的每个元素

Pan*_*een 4 java java-8 java-stream

我有一个List定义如下:

List<Integer> list1 = new ArrayList<>();
list1.add(1); 
list1.add(2);
Run Code Online (Sandbox Code Playgroud)

如何在[2,3]不创建新列表的情况下使用Java 8的Stream API 将List的每个元素增加一个(即以List结尾)?

Hol*_*ger 17

Stream从中创建a 时List,不允许List包文档Stream"非干涉"部分中指定的源修改源.不遵守此约束可能会导致ConcurrentModificationException数据结构损坏,甚至更糟,而不会出现异常.

使用Java Stream直接操作列表的唯一解决方案是创建一个不迭代列表本身的Stream,即迭代索引之类的流

IntStream.range(0, list1.size()).forEach(ix -> list1.set(ix, list1.get(ix)+1));
Run Code Online (Sandbox Code Playgroud)

就像伊兰的回答一样

但是没有必要在Stream这里使用.目标可以简单地实现

list1.replaceAll(i -> i + 1);
Run Code Online (Sandbox Code Playgroud)

这是Java 8中引入的一种新List方法,也允许平滑地使用lambda表达式.除此之外,还有一个可能是众所周知的Iterable.forEach,很好的Collection.removeIf和就地List.sort方法,用于命名其他不涉及Stream API的新Collection操作.此外,Map界面有几个值得了解的新方法.

另请参阅官方文档中的" 在Java SE 8中利用Lambda表达式和流的新增和增强的API ".