当前位置: 首页 > 面试题库 >

forEach不修改java(8)集合

隆安然
2023-03-14
问题内容

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

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

至于forEach方法,请使用Consumer并调用它接受方法。我在上面的代码运行后打印列表,原始列表没有变化。

据我了解,Stream不会改变源,但在这里我只是在每个元素上调用accept方法。

谢谢你在advace


问题答案:

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

的javadoc
forEach说:

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

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

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

如你看到的:

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


 类似资料:
  • 我想用Java 8编写纯函数,它将集合作为参数,对集合每个对象应用一些更改,并在更新后返回一个新集合。我希望遵循FP原则,所以我不希望更新/修改作为参数传递的集合。 有没有什么方法可以通过Stream API做到这一点,而不首先创建原始集合的副本(然后使用forEach或'normal'for循环)? 下面的示例对象,并假设我要将文本追加到object属性之一: 所以我想做一些类似下面的事情,但不

  • 问题内容: 有没有一种方法可以在Java 8中构建使用索引迭代的方法?理想情况下,我想要这样的东西: 我现在能做的最好的事情是: 问题答案: 由于您要遍历可索引的集合(列表等),因此我假设您可以仅遍历元素的索引: 生成的代码类似于使用经典i ++样式的for循环迭代列表,但具有更易于并行化的特性(当然,假设并发对params的只读访问是安全的)。

  • 问题内容: 我在下面有此代码,并且通过执行以下行来获取ConcurrentModificationException: 代码: 堆栈是: 恰好在foreach行上: 我不明白为什么会发生此错误,因为我没有修改列表。 问题答案: 要知道,是 不是抄袭 收集数据,但只有包装原始集合在一个特殊的包装。因此,如果您修改原始集合,则会出现此错误。 如果要创建真正独立的不可修改的集合实例:

  • 《 Java Iterator遍历Collection集合元素》一节中主要讲解如何使用 Iterator 接口迭代访问 Collection 集合里的元素,除了这个方法之外,我们还可以使用 Java 5 提供的 foreach 循环迭代访问集合元素,而且更加便捷。如下程序示范了使用 foreach 循环来迭代访问集合元素。 输出结果为: 小牛知识库C++教程 小牛知识库C语言教程 小牛知识库Jav

  • 问题内容: 假设我有一个整数集,并且我想增加集合中的每个整数。我该怎么做? 我可以在迭代时添加和删除集合中的元素吗? 在迭代原始集合时,是否需要创建一个新集合以将元素“复制并修改”到其中? 编辑:如果集合中的元素是不可变的呢? 问题答案: 您可以在迭代期间使用Iterator对象安全地从集合中删除;尝试在迭代时通过其API修改集合会破坏迭代器。Set类通过getIterator()提供一个迭代器。