forEach不修改java(8)集合
假设我有一个整数列表,我在列表上使用Java8foreach方法将其值加倍。 假设我有以下代码: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方法。 我在运行上述代码后打印列表,原始列表不变 据我所知,流不会改变源代码,但
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);