当前位置: 首页 > 知识库问答 >
问题:

迭代时在Java8中修改stream中的对象

高高雅
2023-03-14

在Java8流中,允许我修改/更新内部的对象吗?为。列表 用户 :

users.stream().forEach(u -> u.setProperty("value"))

共有1个答案

百里飞捷
2023-03-14

是的,您可以修改流中对象的状态,但最常见的情况是,您应该避免修改流源的状态。从stream package文档的非干扰部分,我们可以读到:

对于大多数数据源,防止干扰意味着确保数据源在执行流管道的过程中完全没有被修改。这方面的一个显著例外是其源为并发集合的流,这些集合专门设计用于处理并发修改。并发流源是那些其spliterator报告并发特性的流源。

所以这是可以的

  List<User> users = getUsers();
  users.stream().forEach(u -> u.setProperty(value));
//                       ^    ^^^^^^^^^^^^^
//                        \__/
  users.stream().forEach(u -> users.remove(u));
//^^^^^                       ^^^^^^^^^^^^
//     \_____________________/

并且可能引发ConcurrentModificationException甚至其他意外异常(如NPE:

List<Integer> list = IntStream.range(0, 10).boxed().collect(Collectors.toList());

list.stream()
    .filter(i -> i > 5)
    .forEach(i -> list.remove(i));  //throws NullPointerException
 类似资料:
  • 问题内容: 我正在尝试遍历: …并提取中的每个元素。这是我的方法: 这里的问题是对的每次调用都会从中删除元素,从而修改其大小,从而导致以下错误: 那么…当元素动态变化时,我该如何遍历其中的元素呢? 问题答案: 其他人则提到了正确的解决方案,而没有实际阐明。所以这里是: 另外,如果您想安全地在assign函数中更改映射,则需要传入迭代器(只能使用remove函数,并且只能使用一次)或条目来更改值。

  • 我是java8的新手。 我有以下课程。 我能够保存这个在mongo收集: 现在,我得出了基于spring mongo数据存储库的结果。我想迭代上面的mongo集合,这样我只能得到我尝试过的以下车辆列表: 请帮助我了解java8。提前谢谢

  • 问题内容: 我知道您不应在遍历列表时添加/删除项目。但是,如果不更改列表长度,是否可以修改要迭代的列表中的项目? 还是应该迭代列表索引?像那样: 问题是:以上两种方式都是允许的,还是只有第二种是没有错误的? 如果答案是肯定的,以下代码段是否有效? UPD。我想在python文档中看到“允许这些操作”而不是某人的假设。 问题答案: 可以这么说,您 不是在 修改列表。您只是在修改列表中的元素。我不认为

  • 问题内容: 假设我们有一个Python字典,我们正在像这样迭代它: (并且仅仅是一些黑盒转换。) 换句话说,我们尝试在使用对其进行迭代的同时向其中添加/删除项目。 这个定义好吗?您能否提供一些参考来支持您的答案? (很明显,如果损坏了该如何解决,所以这不是我所追求的角度。) 问题答案: 在python文档页面(针对2.7)上明确提到了 使用而添加或删除字典条目可能会产生一种或无法遍历所有条目。 对

  • 问题内容: 上面的python代码使输出与预期的完全不同。我想循环播放项目,以便在循环播放时可以跳过某个项目。 问题答案: 该代码试图在迭代列表时修改列表。我在任何情况下都不会这样做。 你可以使用运算符跳过列表中的每三个项目。 关于我的示例的其他要点与中的新语法有关。 我使用列表推导定义t,因为它在中有效(请参见下文) t是中的函数 现在,的行为类似于,但它适用于任意大小的值。后者不再存在。