forEach不修改java(8)集合

时间:2014-05-25 05:20:26

标签: java java-8

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

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

至于每个方法采取消费者并称之为接受方法。 我在运行上面的代码后打印列表,原始列表没有变化。

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

在advace中感谢你

3 个答案:

答案 0 :(得分:23)

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

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

答案 1 :(得分:15)

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

forEach的javadoc说:

  

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

     

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

     for (T t : this)
         action.accept(t);

如你所见:

  • actionConsumer;即它不会产生值。
  • 语义不允许更新this集合。

答案 2 :(得分:6)

尝试使用map代替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);