forEach not modify java(8) 集合

2022-09-02 11:17:22

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

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

作为 forEach 方法采取消费者并称之为接受methos。我在运行上述代码后打印列表,原始列表不会更改。

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

谢谢你在广告


答案 1

该方法仅循环访问列表的元素而不更改它们,如果要更改元素,可以使用该方法:forEachreplaceAll

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

答案 2

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

forEach 的 javadoc 说:

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

.....默认实现的行为类似于:

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

如您所见:

  • 是一个 ;也就是说,它不会产生价值。actionConsumer
  • 语义不允许更新集合。this

推荐