Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
forEach不修改java(8)集合_Java_Java 8 - Fatal编程技术网

forEach不修改java(8)集合

forEach不修改java(8)集合,java,java-8,Java,Java 8,假设我有一个整数列表,我在列表上使用Java8foreach方法将其值加倍。 假设我有以下代码: List<Integer> l = Arrays.asList(2,3,6,1,9); l.forEach(p->p*=2); List l=Arrays.asList(2,3,6,1,9); l、 forEach(p->p*=2); 作为forEach方法,使用Consumer并调用它accept方法。 我在运行上述代码后打印列表,原始列表不变 据我所知,流不会改变源代码,但

假设我有一个整数列表,我在列表上使用Java8foreach方法将其值加倍。 假设我有以下代码:

List<Integer> l = Arrays.asList(2,3,6,1,9);
l.forEach(p->p*=2);
List l=Arrays.asList(2,3,6,1,9);
l、 forEach(p->p*=2);
作为forEach方法,使用Consumer并调用它accept方法。 我在运行上述代码后打印列表,原始列表不变

据我所知,流不会改变源代码,但在这里,我只对每个元素调用accept方法


感谢您的建议

尝试使用
map
代替
forEach
更改原始
列表

List<Integer> list = Arrays.asList(2,3,6,1,9);
list=list.stream().map(p -> p * 2).collect(Collectors.toList());
System.out.println(list);
List List=Arrays.asList(2,3,6,1,9);
list=list.stream().map(p->p*2.collect(Collectors.toList());
系统输出打印项次(列表);

forEach没有改变列表的原因归结于规范:

javadoc for说:


default void forEach(Consumer方法
forEach
仅迭代列表中的元素而不更改它们,如果要更改元素,可以使用方法
replaceAll

List<Integer> l = Arrays.asList(2,3,6,1,9);
l.replaceAll(p->p*2);
List l=Arrays.asList(2,3,6,1,9);
l、 replaceAll(p->p*2);

创建一个新列表时,它不会改变现有列表。这样可能更好,但注意区别仍然很重要。谢谢你的回答。我知道使用map来获得新集合和流的map metod。我不明白为什么集合中的每个metod都不改变元素,如果它只是调用给定lambda的accept metod?谢谢你的回答。但是,如果T是某个对象引用,并且我在forEach循环中更改了它的内容,我应该会看到它的新内容。不,无论是否使用lambda,这都不是真的,而且从来都不是。@user1409534-你可以更改对象引用指向的对象的内容,但事实并非如此更新列表。要更新列表(以您尝试的方式),您需要将列表中的对象引用替换为另一个对象引用。您不能使用
forEach()
。lambda肯定不会/不能这样做。
List<Integer> l = Arrays.asList(2,3,6,1,9);
l.replaceAll(p->p*2);