每个有状态的中间 Stream API 操作是否都能保证新的源集合?

2024-04-21

以下陈述是否正确?

The sorted()操作是“有状态中间操作”,这意味着后续操作不再对后备集合进行操作,而是对内部状态进行操作。

(Source https://www.toptal.com/java/top-10-most-common-java-development-mistakes and source https://dzone.com/articles/java-8-friday-10-subtle - they seem to copy from each other or come from the same source.)

免责声明:我知道以下代码片段不是 Java Stream API 的合法用法。不要在生产代码中使用。

我测试过Stream::sorted https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#sorted--作为上述来源的片段:

final List<Integer> list = IntStream.range(0, 10).boxed().collect(Collectors.toList());
    
list.stream()
    .filter(i -> i > 5)
    .sorted()
    .forEach(list::remove);

System.out.println(list);            // Prints [0, 1, 2, 3, 4, 5]

有用。我更换了Stream::sorted https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#sorted-- with Stream::distinct https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#distinct--, Stream::limit https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#limit-long- and Stream::skip https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#skip-long-:

final List<Integer> list = IntStream.range(0, 10).boxed().collect(Collectors.toList());
    
list.stream()
    .filter(i -> i > 5)
    .distinct()
    .forEach(list::remove);          // Throws NullPointerException

令我惊讶的是,NullPointerException被抛出。

所有测试方法均遵循有状态中间操作 https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps特征。然而,这种独特的行为Stream::sorted https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#sorted--没有记录也没有流操作和管道 https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps部分解释了是否有状态中间操作真正保证新源合集。

我的困惑从何而来?上述行为的解释是什么?


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

你的例子碰巧做了你想要的事情;甚至不能保证List由...制作collect(Collectors.toList())支持remove手术。

展示一个反例

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

抛出一个ConcurrentModificationException。原因是该实现优化了这种情况,因为源已经排序。原则上,它可以对原始示例进行相同的优化,如下所示forEach未按指定顺序显式执行操作,因此不需要排序。

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

所以底线是,当依赖于未指定的行为时,今天可能发生的事情可能会在明天添加新的优化时失效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每个有状态的中间 Stream API 操作是否都能保证新的源集合? 的相关文章

  • 如何将画廊意图中的“打开”更改为“完成”?

    我使用以下意图打开画廊来选择多个图像和视频 Intent intent new Intent intent setType image video intent putExtra Intent EXTRA ALLOW MULTIPLE tr
  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • Spring Data JPA 选择不同

    我有一个情况 我需要建立一个select distinct a address from Person a 其中地址是 Person 内的地址实体 类型的查询 我正在使用规范动态构建我的 where 子句并使用findAll Specifi
  • 通往楼梯顶部的可能路径

    这是一个非常经典的问题 我听说谷歌在他们的面试中使用过这个问题 问题 制定一个递归方法 打印从楼梯底部到楼梯顶部的所有可能的独特路径 有 n 个楼梯 您一次只能走 1 步或 2 步 示例输出 如果它是一个有 3 级楼梯的楼梯 1 1 1 2
  • Integer.parseInt("0x1F60A") 以 NumberformatException 结束

    我尝试从数据库中获取长字符串内的表情符号代码 格式如下 0x1F60A 所以我可以访问代码 但它将是String 起初 我尝试通过执行以下操作来转换变量tv setText beforeEmo getEmijoByUnicode int e
  • 如何根据运行的 jar 的结果让我的 ant 任务通过或失败?

    我正在运行 CrossCheck 无浏览器 js 单元测试 作为 ant 脚本的一部分 如果 CrossCheck 测试失败 我希望 ant 报告失败 这是 build xml 中的相关部分
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • 套接字的读写如何同步?

    我们创建一个套接字 在套接字的一侧有一个 服务器 在另一侧有一个 客户端 服务器和客户端都可以向套接字写入和读取 这是我的理解 我不明白以下事情 如果服务器从套接字读取数据 它在套接字中是否只看到客户端写入套接字的内容 我的意思是 如果服务
  • 如何在 Spring 属性中进行算术运算?

  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • HashMap 值需要不可变吗?

    我知道 HashMap 中的键需要是不可变的 或者至少确保它们的哈希码 hashCode 不会改变或与另一个具有不同状态的对象发生冲突 但是 HashMap中存储的值是否需要与上面相同 为什么或者为什么不 这个想法是能够改变值 例如在其上调
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • 使用布尔值进行冒泡排序以确定数组是否已排序

    我有以下用于冒泡排序的代码 但它根本不排序 如果我删除布尔值那么它工作正常 我知道 由于我的 a 0 小于所有其他元素 因此没有执行交换 任何人都可以帮助我解决这个问题 package com sample public class Bub
  • JMenu 中的文本居中

    好吧 我一直在网上寻找有关此问题的帮助 但我尝试的任何方法似乎都不起作用 我想让所有菜单文本都集中在菜单按钮上 当我使用setHorizontalTextPosition JMenu CENTER 没有变化 事实上 无论我使用什么常量 菜单
  • 是否可以使用 Java Guava 将函数应用于集合?

    我想使用 Guava 将函数应用于集合 地图等 基本上 我需要调整 a 的行和列的大小Table分别使所有行和列的大小相同 执行如下操作 Table
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • Java Swing:需要一个高质量的带有复选框的开发 JTree

    我一直在寻找一个 Tree 实现 其中包含复选框 其中 当您选择一个节点时 树中的所有后继节点都会被自动选择 当您取消选择一个节点时 树中其所有后继节点都会自动取消选择 当已经选择了父节点 并且从其后继之一中删除了选择时 节点颜色将发生变化
  • Resteasy 可以查看 JAX-RS 方法的参数类型吗?

    我们使用 Resteasy 3 0 9 作为 JAX RS Web 服务 最近切换到 3 0 19 我们开始看到很多RESTEASY002142 Multiple resource methods match request警告 例如 我们
  • 泛型、数组和 ClassCastException

    我想这里一定发生了一些我不知道的微妙事情 考虑以下 public class Foo

随机推荐

  • 将 UTF-8 编码的转储加载到 MySQL 中

    昨天我为这个问题苦苦思索了几个小时 我在 MySQL 4 1 22 服务器上有一个数据库 编码设置为 UTF 8 Unicode utf8 如 phpMyAdmin 报告 该数据库中的表的默认字符集设置为latin2 但是 使用它的 Web
  • 如何调整 NLTK 句子标记器

    我正在使用 NLTK 来分析一些经典文本 但我在按句子标记文本时遇到了麻烦 例如 这是我从以下内容中得到的片段莫比迪克 http www gutenberg org cache epub 2701 pg2701 txt import nlt
  • 如何对计算值进行排序?

    我目前正在建立一个 NFL 选秀联盟网站 我有一个用户模型 一个游戏模型和一个连接表 用于捕获每个用户的个人选择 游戏模型具有 结果 属性 其中 W 表示获胜 L 表示失败 P 表示推动 平局 我在构建排名页面时遇到问题 目前我的用户模型中
  • 将 cURL json 数组响应转换为关联数组

    我有一个像这样的 cURL 请求 ch curl init data filter year StartTime urlencode eq 2013 and month StartTime urlencode eq 06 curl seto
  • Jenkins Slack 集成

    我想使用 Jenkins 中的 Slack 插件将通知发送到 Slack 通道 当我测试连接时 Jenkins 表示成功 但我在 Slack 频道中没有收到任何通知 是否存在任何已知问题 如何让 Jenkins 向 Slack 发送通知 我
  • 操作栏图标大小

    根据操作栏图标 https developer android com guide practices ui guidelines icon design action bar html size11mdpi 屏幕的操作栏图标应为 24 x
  • 如何使用 Slick 3.0 编写可读的嵌套连接查询

    此代码创建一个查询 用于在 Web 后端检索用户的个人资料 它创建一个查询 将必要的信息组装到 DTO 这只是一个案例类 中 随后以 JSON 形式发回 def getProfile userId Long val q for u p a
  • 从 powershell 脚本调用可执行文件(带参数)

    我正在从 powershell 调用 zip 实用程序 但很难直接获取其参数 这是代码 if not test path C Program Files x86 7 Zip 7z exe throw C Program Files x86
  • 创建嵌套 ul li 的 PHP 函数?

    我正在尝试将一个小型 CMS 附加到我正在创建的网站 不过我遇到了一个小问题 CMS 使用 PHP 函数插入菜单 这些 PHP 函数创建 HTML 我希望使用的特定函数 treemenu 创建一个嵌套的 ul li 然后可将其用于下拉菜单
  • 如何更改此 html 用户表单上的日期格式

    我有将数据输入 mysql DB 的 html 表单 但在日期的输入字段中它具有以下格式 mm dd yyyy 但我更喜欢在输入日期时使用这种格式 dd mm yyyy 任何机构都可以帮助更改格式吗 这里是 HTML 表单 p Admiti
  • IDispatchEx 存在于哪里?

    找不到包含 IDispatchEx 接口的库 我想实现这个接口 但是找不到 有谁知道它在哪里吗 谢谢 保罗 如果您想编写一个实现的托管类IDispatchEx http msdn microsoft com en us library sk
  • 带有 Kafka 消费者的 Spring Boot 作业调度程序

    我正在开发一个 POC 我想使用来自 Kafka 主题 用户 的消息 尝试实现消费者应该从 Kafka 主题读取消息 一旦 spring boot 调度程序在预定时间或 cron 时间触发 那么我们应该开始从 kafka 主题中一一消费现有
  • 如何更改 richfaces 组合框提出的建议?

    我目前正在玩 richfaces 组合框 你可以检查是 我想知道是否有办法改变在组合框中提出建议的方式 而不是仅建议以同一字母开头的单词 而是建议具有以该字母或字母组合开头的其他单词的单词 这是演示中的示例 从当前的组合框中 如果我输入 M
  • WKWebView 评估 Javascript 而不重新加载页面

    目前我只能通过将 javascript 添加到 webview 的配置的 userContentController 并重新加载页面来弄清楚如何评估 javascript 如下所示 WKUserScript script WKUserScr
  • 如果
    中的操作字段有参数会发生什么?

    如果我在 HTML 中执行以下操作 是否会出现一个得到良好支持的常见行为
  • 如何在运行 Tensorflow 推理会话之前批处理多个视频帧

    我做了一个项目 基本上使用谷歌对象检测 API 和张量流 我所做的就是使用预先训练的模型进行推理 这意味着实时对象检测 其中输入是网络摄像头的视频流或使用 OpenCV 的类似内容 现在我得到了相当不错的性能结果 但我想进一步提高 FPS
  • 排序逻辑应该放在模型、视图还是控制器中? [关闭]

    想要改进这篇文章吗 提供此问题的详细答案 包括引用和解释为什么你的答案是正确的 不够详细的答案可能会被编辑或删除 Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有一个下拉列表 向最终用户显
  • 玩笑 beforeAll() 在多个测试文件之间共享

    我有一个 Node js 项目 正在使用 Jest 进行测试 我有几个具有相同设置要求的测试文件 以前 所有这些测试都在一个文件中 所以我只有一个beforeAll 执行常见设置 现在 随着测试分成多个文件 似乎我必须复制 粘贴它befor
  • AsyncPostBackTrigger 与 PostBackTrigger 有什么区别?

    AsyncPostBackTrigger 与 PostBackTrigger 有什么区别 默认情况下 UpdatePanel 内部的控件会导致部分页面更新 外部的控件会导致回发 使用这些触发器可以根据需要更改此行为 From http se
  • 每个有状态的中间 Stream API 操作是否都能保证新的源集合?

    以下陈述是否正确 The sorted 操作是 有状态中间操作 这意味着后续操作不再对后备集合进行操作 而是对内部状态进行操作 Source https www toptal com java top 10 most common java