您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Java 8 Stream API-是否有状态中间操作保证新的源集合?

Java 8 Stream API-是否有状态中间操作保证新的源集合?

api文档没有这样的保证“后续操作将不再对后备集合进行操作”,因此,您永远不应依赖于特定实现的这种行为。

您的示例碰巧偶然地完成了所需的操作;甚至不能保证List创建的bycollect(Collectors.toList())支持remove操作。

展示一个反例

Set<Integer> set = IntStream.range(0, 10).@R_656_2419@ed()
    .collect(Collectors.toCollection(TreeSet::new));
set.stream()
    .filter(i -> i > 5)
    .sorted()
    .forEach(set::remove);

抛出一个ConcurrentModificationException。原因是实现已优化了此方案,因为源已被排序。原则上,它可以对原始示例进行相同的优化,就像forEach不按指定顺序显式执行操作一样,因此不需要排序。

还有其他可以想象的优化,例如sorted().findFirst()可以转换为“查找最小值”操作,而无需将元素复制到新存储中进行排序。

因此,最重要的是,当依赖于未指定的行为时,今天发生的事情可能会在明天添加新的优化措施而中断。

java 2022/1/1 18:31:42 有481人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶