Java 8 Streams 的短路如何工作?

2024-04-04

阅读了一些有关 Java 8 的内容,我必须this https://thecannycoder.wordpress.com/2014/08/10/collectors-part-1-reductions-and-short-circuiting-operations%E2%80%8F/博客文章解释了一些关于流和减少流的信息,以及何时可以短路减少。底部写着:

请注意以下情况findFirst or findAny我们只需要与谓词匹配的第一个值(尽管findAny不保证返回第一个)。但是,如果流没有顺序,那么我们期望findFirst表现得像findAny。行动allMatch, noneMatch and anyMatch可能根本不会短路流,因为它可能需要评估所有值来确定运算符是否是true or false。因此,使用这些的无限流可能不会终止。

我明白了findFirst or findAny可能会使还原短路,因为一旦找到元素,就不需要进一步处理。

但为什么这对allMatch, noneMatch and anyMatch? For allMatch,如果发现与谓词不匹配,则可以停止处理。没有人也一样。和anyMatch特别是对我来说没有意义,因为它几乎等于findAny(除了返回的内容)?

说这三个不能短路,因为可能需要评估所有值,也可以说findFirst/Any.

我缺少一些根本的区别吗?我真的不明白发生了什么吗?


有一个微妙的区别,因为anyMatchfamily 使用谓词,而findAny家人没有。从技术上来说findAny()好像anyMatch(x -> true) and anyMatch(pred)好像filter(pred).findAny()。所以这里我们有另一个问题。考虑我们有一个简单的无限流:

Stream<Integer> s = Stream.generate(() -> 1);

所以申请确实如此findAny()在应用时,此类流将始终短路并完成anyMatch(pred)取决于谓词。然而,让我们过滤我们的无限流:

Stream<Integer> s = Stream.generate(() -> 1).filter(x -> x < 0);

结果流也是无限的吗?这是一个棘手的问题。它实际上不包含任何元素,但要确定这一点(例如,使用.iterator().hasNext())我们必须检查无限数量的底层流元素,所以这个操作永远不会完成。我也将这种流称为无限流。然而使用这样的流anyMatch and findAny永远不会完成:

Stream.generate(() -> 1).filter(x -> x < 0).anyMatch(x -> true);
Stream.generate(() -> 1).filter(x -> x < 0).findAny();

So findAny()也不保证完成,它取决于之前的中间流操作。

总而言之,我认为该博文非常具有误导性。在我看来,无限流行为在官方中得到了更好的解释JavaDoc https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps.

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

Java 8 Streams 的短路如何工作? 的相关文章

  • 如何在谷歌地图中使用latlng字符串数组绘制多边形

    在我的应用程序中 我有包含 imagview 的 recyclerview 并且该 imageview 通过使用我存储在 sqlite 中的坐标包含静态地图图像 当我单击该图像时 我将该字符串数组格式的坐标传递给其他地图活动 然后使用该字符
  • 为什么byteArray的长度是22而不是20?

    我们尝试从字符串转换为Byte 使用以下 Java 代码 String source 0123456789 byte byteArray source getBytes UTF 16 我们得到一个长度为 22 字节的字节数组 我们不确定这个
  • 通过 JDBC 连接到 DB2 时的用户和密码

    我正在尝试连接到本地 DB2 10 5 Express C 服务器 这是一个测试环境 所以我不关心安全性 我能够连接到命令行处理器 在 Windows 上运行 并且我更改了配置设置AUTHENTICATION CLIENT and TRUS
  • 如何避免 Java 中的忙旋转

    我有一个多线程应用程序 其中一个线程向另一个线程发送消息 等待线程轮询消息并做出反应 处理锁 像这样 等待线程代码 while true if helloArrived System out println Got hello if bye
  • Maven 2 未运行 Junit 4 测试

    我在确保运行 Junit4 测试时遇到问题 同样的问题也被报告在https stackoverflow com questions 2021771 sort newest sort top https stackoverflow com q
  • 使用 Hibernate 和 Apache DBCP 的 MySQL 连接池问题

    看来我的应用程序有问题 当应用程序在启动后闲置很长时间 我不确定确切的时间 时 我会在日志中收到以下错误消息 我使用 Spring Hibernate MySQL 和 ApacheDBCP 进行连接池 ERROR org hibernate
  • Tomcat - 多个 webapps 文件夹

    是否可以有多个文件夹来放置要部署的应用程序 这些是如何定义的 是否可以将一个文件夹限制为仅是 domain com 的应用程序 而不是其他域 Thanks 看一眼conf server xml
  • a4j:commandLink 重新渲染后停止工作

    我创建了这个测试用例来隔离我的问题 一旦轮询执行 ajax 更新 a4j commandLink 操作就不会执行 如果我们在轮询重新渲染之前关闭 modalPanel 则会执行它 有什么建议吗 提前致谢 测试 xhtml
  • Android 反向地理编码不适用于华为设备

    我正在尝试通过这段代码反转地理编码纬度 经度 Geocoder geocoder new Geocoder context Locale ENGLISH try List
  • Java检测鼠标长按

    如果用户按下 JList 组件超过 3 秒 有什么方法可以捕获事件吗 我发现困难的部分是即使在用户松开鼠标左键之前也需要触发事件 这可以通过 mousePressed 和 mouseReleased 组合轻松完成 您可以在 mouseDow
  • Spring Boot 多部分文件始终为 null

    我正在使用 Spring Boot version 1 4 0 RC1 和 Spring Boot Stormpath 1 0 2 我正在尝试使用分段文件上传 但控制器中的 MultipartFile 始终为空 当我使用 RequestPa
  • 如何使用键盘上的“删除”按钮作为从 JTable 中删除行的快捷方式[重复]

    这个问题在这里已经有答案了 可能的重复 如何制作删除按钮来删除JTable中的行 https stackoverflow com questions 13236206 how to make delete button to delete
  • 将 XML 从网站解析到 Android 设备

    我正在启动一个 Android 应用程序 它将解析来自网络的 XML 我创建了一些 Android 应用程序 但它们从未涉及解析 XML 我想知道是否有人对最佳方法有任何建议 这是一个例子 try URL url new URL your
  • 如何在不同的班级中启动和停止计时器?

    我想测量从传入 HTTP 请求开始到应用程序到达某个点的时间 这两个时间点都位于不同的类中 我将如何启动和停止这些不同类别的计时器 我没有看到使用 MeterRegistry 中的 命名 计时器的方法 我该怎么办呢 您可以使用 AOP 如下
  • 如何发现另一个应用程序的意图

    我正在尝试构建一个应用程序来接收来自 StumbleUpon 应用程序的共享 此时 我可以接收浏览器的 共享网址 但是当从 StumbleUpon 共享时 我的应用程序不会显示在列表中 我想我可能没有在清单中注册正确的意图 有什么方法可以找
  • Java 空值检查

    我有一个thread1 if object null object play 和另一个thread2可以写null into object随时参考 我将同时运行这些线程 我知道thread2可以重写object后参考null检查并会抛出Nu
  • 将字符串转换为字符并按降序排序(ascii)

    我正在创建一个程序 该程序将使用户输入整数 一个接一个 存储在数组中并按降序显示整数 该程序还要求用户输入一个字符串 使用以下命令将其转换为字符string toCharArray 我已经正确地按降序显示整数 问题是我不知道如何按降序显示字
  • 如何从 java.sql.Blob 类型的 zip 文件中读取和提取 zip 条目,而无需将 FileInputStream 或文件路径作为字符串 java

    public static void unzipFiles java sql Blob zip throws Exception String paths byte blobAsBytes zip getBytes 1 int zip le
  • 有没有办法处理Java堆空间异常[重复]

    这个问题在这里已经有答案了 我正在寻找将文件输入流转换为大文件 文件大小为 100MB 并且抛出 java lang OutOfMemoryError Java Heap space import java io FileInputStre
  • Java 中 .NET 的 Lambda 表达式

    我最近 再次 从 C 迁移到 Java 但我非常怀念 lambda 表达式和 C 的 IEnumerable Foreach 之类的东西 所以我正在寻找Java中的lambda表达式库 有比这更好的图书馆吗LambdaJ http code

随机推荐

  • 我们可以在 Android 中的短信到达收件箱之前将其删除吗?

    我正在从收件箱中删除一条短信 但我想知道 如何在它到达收件箱之前将其删除 Yes 尽管对这个问题有一些负面反应 但短信拦截有合法的用途 例如 自动电话号码验证 通过短信提供的服务 尽管通常这应该通过数据短信来完成 或者通过处理特殊格式的消息
  • Hexfloat机械手和精度

    如何使用输出hexfloat操纵器忽略任何精度ostream include
  • 如何在 Windows 中从 Google Code 下载/签出项目?

    当没有准备好的可用下载时 如何从 Google Code 下载整个项目的 ZIP 文件 这是我在结帐页面上看到的 命令行访问使用此命令可以匿名查看最新的项目源码 svn checkout http myproject googlecode
  • 向将数组作为字段之一的 Hive 表插入行时出现错误 10293

    我使用以下查询创建了一个配置单元表 create table arraytbl id string model string cost int colors array
  • ASP.NET 版本列表?

    感谢 stackoverflow 上的问答 我刚刚发现如何确定托管提供商服务器上安装的版本 现在我需要知道这个数字意味着什么 Using 在我的本地计算机上返回 2 0 50727 3053 有人能给我一份实际版本 1 1 1 2 等的列表
  • Maven多模块和Spring微服务的区别?

    我正在阅读下一个项目的 Spring 微服务 Tut 说 这种架构风格将主应用程序划分为一组称为微服务的子应用程序 一个大型应用程序划分为多个协作进程 所以我们已经有了一个框架 Maven 多模块 根据我的经验 我将项目分开了 尽管确实如此
  • 编译器无法推断返回类型

    Swift 无法推断函数的返回类型 该函数的参数是闭包 并且返回类型是从闭包的返回类型推导出来的 给定这个通用类 class Bar
  • ScikitLearn 的 MLPClasssifier 在输出层使用什么样的激活?

    我目前正在处理给定类标签 0 和 1 的分类任务 为此 我使用 ScikitLearnMLPClassifier为每个训练示例提供 0 或 1 的输出 但是 我找不到任何文档 说明 MLPClassifier 的输出层到底在做什么 哪个激活
  • IE10支持FormData()吗?

    我读了 here http msdn microsoft com en us library ie hh772723 v vs 85 aspx IE10 支持 FormData 但是当我在 IE10 JavaScript 控制台中输入以下内
  • 在服务器上运行我的 Rails 应用程序

    这是我第一次将 Rails 应用程序部署到服务器 它在本地运行得很好 但是当我尝试将其移动到服务器进行生产时 它没有显示 我得到的只是显示我的项目文件夹的图像 我需要做任何改变吗 以下是我已经完成的更改 数据库 yml gt 生产 改变了环
  • php imagecopyresized vs imagecopyresampled vs imagecopy 优点/缺点

    这些似乎都在做同样的事情 各自的优点 缺点是什么 imagecopyresized vs imagecopyresampled vs imagecopy 我正在调整用户提交的图像的大小 所以我有一个使用 newImage imagecrea
  • 我应该使用位字段来映射传入的串行数据吗?

    我们有通过串行 蓝牙 传入的数据 它映射到特定的结构 该结构的某些部分是子字节大小 因此 显而易见 的解决方案是将传入数据映射到位字段 我无法确定的是机器或编译器的位字节顺序是否会影响它 这很难测试 以及我是否应该完全放弃位字段 例如 我们
  • 如何通过变量动态调用 ember 组件?

    假设我的控制器上有一个小部件对象数组 每个小部件对象都有分配了组件类名称的成员变量 如何让我的模板调用该组件 widgets 0 widget componentClass blog post each widget in widgets
  • 更改 Azure Web 应用程序中的目标框架

    我想使用 Azure Web 应用程序将 ASP NET Core 2 1 网站发布到 Azure 来托管它 在 Azure 门户上创建 Azure Web App 时 其中一项设置是 运行时堆栈 在本例中 我将其设置为 NET Core
  • C# 中反转 1 位

    我有 1 位byte 始终处于最低顺序位置 我想反转 即给定 00000001 我想要得到 00000000 而对于 00000000 我想要 00000001 我是这样解决的 bit gt 0 0 1 我很好奇还能怎么做 怎么样 bit
  • Extjs 4.2 缓冲存储同步数据不起作用

    这是商店代码 Ext define NG store WhatsNews extend NG store AbstractStore model NG model auxClasses notifications WhatsNew alia
  • 为什么 -freciprocal-math 在 GCC 中不安全?

    freciprocal math在GCC中更改以下代码 double a b c to double tmp 1 c double a b tmp 在GCC手册中 据说这样的优化是不安全的并且不遵守IEEE标准 但我想不出一个例子 你能举个
  • Solr:如何动态提升有限数量的文档? QueryElevationComponent 是否需要修改?

    我的要求是提升数量有限针对用户请求的 例如五个 文档 我有的是一个文档字段它存储类似于表示增强值的数值电梯排名值 因此 用户查询将返回 5 个具有最高电梯排名值的文档 其余文档按常规顺序填充页面 怎么做 The QueryElevation
  • 30 页面上的 Facebook Like 按钮是否会导致网络浏览器负担过重?

    在包含大约 30 个条目的列表的页面上 每个条目都是 Facebook 喜欢的 每个条目的 HTML 包含一个 喜欢 按钮 并且每个条目要么显示 要么不显示 取决于过滤器设置 该页面需要几秒钟才能完全加载 由于 赞 按钮 该页面占用了大量内
  • Java 8 Streams 的短路如何工作?

    阅读了一些有关 Java 8 的内容 我必须this https thecannycoder wordpress com 2014 08 10 collectors part 1 reductions and short circuitin