forEach不修改java(8)集合

use*_*534 13 java java-8

假设我有一个整数列表,我在列表中使用Java 8 forEach方法将其值加倍.说我有以下代码:

List<Integer> l = Arrays.asList(2,3,6,1,9);
l.forEach(p->p*=2);
Run Code Online (Sandbox Code Playgroud)

至于每个方法采取消费者并称之为接受方法.我运行上面的代码后打印列表,原始列表不会更改.

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

谢谢你的推荐

nos*_*sid 24

该方法forEach只迭代列表的元素而不更改它们.如果要更改元素,可以使用以下方法replaceAll:

List<Integer> l = Arrays.asList(2,3,6,1,9);
l.replaceAll(p->p*2);
Run Code Online (Sandbox Code Playgroud)


Ste*_*n C 16

forEach不会改变列表的原因归结为规范:

javadoc forEach说:

default void forEach(Consumer<? super T> action)

.....默认实现的行为如下:

     for (T t : this)
         action.accept(t);
Run Code Online (Sandbox Code Playgroud)

如你看到的:

  • action是一个Consumer; 即它不会产生价值.
  • 语义不允许this更新集合.

  • 不,无论是否有羔羊都没有,而且从来没有. (2认同)

Mas*_*dul 7

尝试使用mapinsted forEach改变原始List.

List<Integer> list = Arrays.asList(2,3,6,1,9);
list=list.stream().map(p -> p * 2).collect(Collectors.toList());
System.out.println(list);
Run Code Online (Sandbox Code Playgroud)

  • 这会创建一个新列表,它不会改变现有列表.这种方式可能更好,但了解这种区别仍然很重要. (8认同)