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

新手上路,请多包涵

在 Java8 流中,我可以在其中修改/更新对象吗?例如。 List<User> users

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

原文由 Tejas Gokhale 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 332
1 个回答

是的,您可以修改流中对象的状态,但大多数情况下您应该避免修改流 的状态。从流包文档的 非干扰 部分我们可以读到:

对于大多数数据源来说,防止干扰就是保证数据源在流水线执行过程中 _完全不被修改_。一个明显的例外是源是并发集合的流,它们专门设计用于处理并发修改。并发流源是那些 Spliterator 报告 CONCURRENT 特性的源。

所以这没关系

  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

原文由 Pshemo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题