理解java 8流的过滤方法

2023-11-21

我最近了解到StreamJava 8 中的 s 并看到了这个示例:

IntStream stream = IntStream.range(1, 20);

现在,假设我们想要找到第一个既能被 3 又能被 5 整除的数字。我们可能会filter两次并且findFirst如下:

OptionalInt result = stream.filter(x -> x % 3 == 0)
                               .filter(x -> x % 5 == 0)
                               .findFirst();

这一切听起来都很合理。当我尝试这样做时,令人惊讶的部分出现了:

OptionalInt result = stream.filter(x -> {System.out.println(x); return x % 3 == 0;})
                           .filter(x -> {System.out.println(x); return x % 5 == 0;})
                           .findFirst();

System.out.println(result.getAsInt());

我期望得到类似的东西:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20进而:3 6 9 12 15 18。因为我们首先迭代 1 到 20 之间的所有数字,所以只过滤掉那些能被 3 整除的数字,然后迭代这个新的Stream并找出那些能被 5 整除的数。

但我得到了这个输出:1 2 3 3 4 5 6 6 7 8 9 9 10 11 12 12 13 14 15 15 15

看起来它并没有涵盖所有数字。此外,看起来它检查x % 5 == 0只适用于那些能被3整除的数字。

我不明白它为什么不迭代所有数字。

这是在线代码片段:http://www.tryjava8.com/app/snippets/5454a7f2e4b070922a64002b


嗯,关于流需要理解的是,与列表不同,它们并不(必然)保存所有项目,而是一次计算每个项目(惰性求值)。

这意味着当你这样做时IntStream stream = IntStream.range(1, 20);您实际上并没有创建包含 20 个项目的集合。您创建了一个动态计算的集合。每次调用该流的next将计算下一项。其余的项目仍然“不存在”(可以这么说)。

过滤器也是如此。

当您添加检查除以 3 的过滤器时,您将得到一个由 2 个计算组合而成的新流 - 第一个计算返回从 1 到 20 的数字,第二个计算返回除以 3 的数字。重要的是要理解每次只计算第一项。这就是为什么当您添加除以 5 的检查时,它仅适用于那些可被 3 整除的项目。同样的道理,为什么打印会在 15 处停止。findFirst方法返回通过所有 3 次计算(1-20 范围计算、除以 3 计算和除以 5 计算)的第一个数字。

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

理解java 8流的过滤方法 的相关文章

  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • 将数据从关系型数据库迁移到NoSQL

    是否有可能 是否有工具 最佳实践等将数据从关系数据库迁移到 NoSQL 格式 我有一个 JEE6 应用程序 利用 Hibernate ORM 持久保存到 MySQL 但现在我们希望转向 NoSQL 解决方案 但需要携带现有数据 Thanks
  • (OS 10048) 每个套接字地址(协议/网络地址/端口)通常只允许使用一次。视窗阿帕奇

    当尝试在 Windows 服务器上执行 httpd exe 时 出现以下错误 OS 10048 每个套接字地址 协议 网络地址 端口 通常只允许使用一次 AH00072 make sock 无法绑定到地址 myIpAddress 80 AH
  • 将简单的 HTML 转换为 RichTextBlock

    我从 Windows 8 开始 尝试将 HTML 转换为RichTextBlock I 已读过我可以使用这个功能 HtmlUtilities ConvertToText in a TextBlock但我找不到在中使用此功能的方法RichTe
  • Microsoft.Reporting.* 与 XML/XSLT

    我想向 NET 应用程序添加报告功能 我的数据源只是应用程序的数据模型 即可能从任何东西 不一定从数据库 生成或加载的一堆对象 最初的计划是从这些对象生成报告数据 XML 文件 然后使用 XSLT 将其转换为 XHTML 报告文件 然后可以
  • Spring Security 并发控制

    我已经使用了 spring security 3 0 7 并且正在我的项目中实现并发控制 但它不起作用 我用过
  • 如何以编程方式获取 OS X 上给定 PID 的打开文件描述符列表?

    我所看到的一切都说要使用lsof p 但我正在寻找不需要 fork exec 的东西 例如 在 Linux 上 人们可以简单地步行 proc pid fd You can use proc pidinfo与PROC PIDLISTFDS枚举
  • iOS16+ 横向显示 UIViewController 仅适用于单屏无法工作 [Swift 5.7]

    在 iOS 16 之前 横向呈现单屏对于纵向应用来说是可以的 工作代码如下 Remark 整个应用程序仅处于纵向模式 override public var shouldAutorotate Bool return false overri
  • 按下按钮即可在听筒和扬声器之间切换

    我试图通过在扬声器和耳机之间切换按钮来播放两者的音频 问题是我试图默认从耳机播放音频 但没有任何结果 然后 当我按下按钮切换到扬声器时 仍然没有音频播放 我正在从本地原始文件播放 我在清单中也有 android permission MOD
  • Internet Explorer 忽略某些域上的 cookie(无法读取或设置 cookie)

    我有一个网站 例如example com 用户可以在其中设置自己的子域 一个用户 一个子域 并上传自己的脚本 例如http somedomain example com xyzzy php将映射到 www somedomain xyzzy
  • Knockout.js 在半大型数据集下非常慢

    我刚刚开始使用 Knockout js 一直想尝试一下 但现在我终于有了借口 但是 当将表绑定到相对较小的一组表时 我遇到了一些非常糟糕的性能问题 数据 大约 400 行左右 在我的模型中 我有以下代码 this projects ko o
  • EditText 自定义字符串格式

    我搜索了与我的问题类似的每个问题 但没有成功 我的问题是这样的 我想格式化一个字符串EditText打字时 格式是这样的 它始终是一个 19 位数字 012345 01 0123456789 0 正如您所看到的 我想在用户打字时需要时添加空
  • 判断状态栏是在顶部还是底部?

    我想弄清楚如何判断状态栏的位置 顶部或底部 我尝试检查HierarchyViewer但没有看到状态栏视图 我真正需要弄清楚的是 在给定上下文的情况下 返回一种方法boolean 如果栏位于顶部则为 true 如果不在顶部则为 false 就
  • 如何确定 System.Diagnostics.Process 是 32 位还是 64 位?

    I tried process MainModule FileName Contains x86 但它引发了 x64 进程的异常 Win32Exception 仅完成了 ReadProcessMemory 或 WriteProcessMem
  • 在页面加载时重复并添加列到标题和项目模板

    除了显示数据表中的数据之外 我没有使用中继器 我正在构建一个网格 它显示用户列表和用户已分配的角色列 用复选框显示 下面用 true false 显示 但假装它们是复选框 ex 代表姓名 呼叫者 结案者 经理 超级用户 鲍勃 真实 真实 假
  • 如何使用 Nokogiri 将嵌套哈希转换为 XML

    我有很多级别的嵌套哈希 例如 foo gt bar foo1 gt foo2 gt bar2 foo3 gt bar3 foo4 gt foo5 gt bar5 我怎样才能将它们转换成这样的XML
  • 如何选择 nHibernate 子查询结果的 Count(*)

    为了在 nHibernate 中分页查询 我需要执行以下操作 Select count from Select e ID e Name from Object as e where 我尝试过以下方法 select count from Ob
  • C# 将字符串“0”解析为整数

    我有一台新笔记本电脑在工作 本周早些时候运行的代码今天不起作用 之前工作的代码经过简化 while dr Read int i int Parse dr GetString 1 现在 当数据库值为 0 时 它会失败 有时 但不可靠 这会起作
  • 使用 pandas 创建矩阵结构

    我已将包含代码和系数数据的以下 CSV 文件加载到以下数据框 df 中 CODE COEFFICIENT A 0 5 B 0 4 C 0 3 import pandas as pd import numpy as np df pd read
  • PHP 中的 A* 搜索算法 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 有没有人有实施A 算法在 PHP 中 我知道维基百科有一个伪代码和一个 C 伪代码的链接 但我似乎找不到已经用 PHP 编写的伪代码 我也在寻找一种高效的书面 A 算法 None
  • 理解java 8流的过滤方法

    我最近了解到StreamJava 8 中的 s 并看到了这个示例 IntStream stream IntStream range 1 20 现在 假设我们想要找到第一个既能被 3 又能被 5 整除的数字 我们可能会filter两次并且fi