在JDK 9(以及8)以及更高版本中,所有内容都可以作为一个流
在JDK 8中,我们终于可以使用流了,除了您使用的API无法产生流的时代之外,其他一切都很好。 然后,您最终编写了一个包装器类方法,该方法允许您将迭代器转换为Stream,因为您错过了流。
public static <T> Stream<T> asStream(Iterator<T> it) {return StreamSupport.stream(Spliterators.spliteratorUnknownSize(it,Spliterator.IMMUTABLE | Spliterator.ORDERED),false);
}
现在有一些方法可以在迭代和生成的情况下以编程方式生成流,但是这两种方法都会生成无限流,而在大多数情况下,您确实想将现有接口改编为有限流。
在JDK 9中,通过引入一种新形式的迭代方法很好地解决了该问题,该方法允许您提供一个谓词来表示流的结束。
在下面的示例中,我将使用谓词,该谓词将一直持续到您获得流的空条目为止,然后由读者自己来提出谓词的更多想象力。 在这个简单的示例中,我使用Throwable的getCause方法使我们沿着错误的链接列表移动。 请注意,与预发布版本相比,这将花费很少的代码。
// Simple linked list
//
Exception e = new Exception("one");
Exception e2 = new Exception("two",e);
Exception e3 = new Exception("three", e2);Stream.iterate(e3, Objects::nonNull, Throwable::getCause)// Output the messages in turn.map(Throwable::getMessage).forEach(System.out::println);
第二个示例将ReferenceQueue转换为Stream,以便我们可以轻松地耗尽其内容以根据需要进行处理。 这段代码有些不同,因为容器与要处理的对象不同,因此我们使用相同的方法提供种子和下一个值,当队列为空时,它返回null。
ReferenceQueue<Thing> queue = new ReferenceQueue<>();// Make some things and then collect them
WeakReference one = new WeakReference<Thing>(new Thing(), queue);
WeakReference two = new WeakReference<Thing>(new Thing(), queue);
System.gc(); System.gc(); System.gc(); System.gc(); System.gc();Stream.<Reference<? extends Thing>>iterate(queue.poll(), Objects::nonNull, v -> queue.poll()).forEach(System.out::println);
第三个示例显示了如何在Node树上行走,请注意,当我们工作到叶子的末尾时,嵌套的流迭代器将备份列表。
Node root = doc.getDocumentElement();Stream.iterate(root,Objects::nonNull,v -> {if (v.getFirstChild()!=null) {return v.getFirstChild();}if (v.getNextSibling()!=null) {return v.getNextSibling();}return Stream.iterate(v, Objects::nonNull, Node::getParentNode).filter(node -> node.getNextSibling()!=null).map(Node::getNextSibling).findFirst().orElse(null);}).map(Node::getNodeName).forEach(System.out::println);
因此,通过进行少量的心理操练,就可以将大多数旧版API转换为干净的Stream,因此您可以忽略那些讨厌的老式循环。 而且,如果您陷于JDK 8中,那么很容易使用之前的asStream来组合类似的功能:
public static<T> Stream<T> iterateFinite(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next) {return asStream(new Iterator<>() {T current = seed;@Overridepublic boolean hasNext() {return hasNext.test(current);}@Overridepublic T next() {if (current == null) {throw new NoSuchElementException();}try {return current;} finally {current = next.apply(current);}}});
}
翻译自: https://www.javacodegeeks.com/2018/12/jdk-9-everything-can-stream.html
在JDK 9(以及8)以及更高版本中,所有内容都可以作为一个流相关推荐
- 棉花糖多少钱_如何在6.0棉花糖及更高版本中访问Android的正在运行的应用程序列表...
棉花糖多少钱 In Android 5.x and below, accessing your list of running apps was simple-you'd jump into Sett ...
- 泽西岛2.9及更高版本中的声明式链接
几个星期前几个月前,我正在寻找如何为Oracle Cloud项目设计新的REST API. 我计划要做的事情之一就是使用Marc Hadley在Jersey 1.x中创建的声明性链接注入. 可悲的是这 ...
- jdk11换jdk8版本_在JDK 9(以及8)以及更高版本中,所有内容都可以作为一个流
jdk11换jdk8版本 在JDK 8中,我们终于可以使用流了,除了您使用的API无法产生流的时代之外,其他一切都很好. 然后,您最终编写了一个包装器类方法,该方法允许您将迭代器转换为Stream,因 ...
- 如何使用XE2及更高版本中提供的自定义皮肤(样式)功能
1. 制作样式文件: 点击 XE2+ 的 IDE 菜单上的 Tools-->Bitmap Style Designer, 打开设计器. 为每个需要的元素设计好图片或颜色或字体. 最重要的是, 要 ...
- 停止、启动或重新启动 VMware vCenter Server Appliance 6.x 及更高版本上的服务 (2109887)
停止.启动或重新启动 VMware vCenter Server Appliance 6.x 及更高版本上的服务 (2109887) https://kb.vmware.com/s/article/2 ...
- Android Studio TV开发教程(十五) Android N及更早版本中的建议
Android Studio TV开发教程 (转自Android官网https://developer.android.com/training/tv/start) 文章源自:光谷佳武 https:/ ...
- ios 查找朋友 android,在 iOS 12 或更低版本中设置和使用“查找我的朋友”
如果您使用的是 iOS 13.iPadOS.macOS Catalina 或更高版本,则"查找"App 已将"查找我的 iPhone"和"查找我的朋友 ...
- Dubbo 高危反序列化漏洞,存在远程代码执行风险,建议及时升级到2.7.7或更高版本!...
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 以下内容转载自安全客,原文链接:https://www. ...
- Maven编译项目时报错:不再支持源选项 5。请使用 6 或更高版本。 不再支持目标选项 1.5。请使用 1.6 或更高版本。
在使用Maven编译项目时报错: 不再支持源选项 5.请使用 6 或更高版本. 不再支持目标选项 1.5.请使用 1.6 或更高版本. 在项目pom.xml文件中增加maven编译的jdk版本设置,m ...
最新文章
- php 计算一个字符串在另一个字符串中出现的次数
- mysql带AND关键字的多条件查询
- flot中文API(转载)
- 做python自动化得时候怎么添加断言_在编写Web自动化测试用例的时候,如何写断言使新手不解,严格意义上来讲,没有断言的自动化脚本不能叫测试用例。就像功能测试一样,当测试人员做了一些操作...
- python shutil模块用法实例分析_Python shutil模块用法实例分析
- 网络名称 转换 网络地址_网络地址转换| 计算机网络
- 用定时器控制灯的闪烁梯形图_用西门子PLC设计灯的闪烁的梯形图,就只要梯形图。...
- iOS h264硬编码
- Edge,IE浏览器 兼容模式设置
- 消息中间件选型分析:从 Kafka 与 RabbitMQ 对比
- 华院计算|切比雪夫,他带起了俄罗斯现代数学的发展
- Google搜索引擎的奥秘
- 不得不会的软件测试bug分析定位技巧
- 【论文阅读】Alignment-Robust Cancelable Biometric Scheme for Iris Verification
- 介绍一下当前使用的Oracle数据库自动化运维方式
- python实现音乐定时开关,模拟上下课铃声(含程序打包微小exe文件方法介绍)
- 商品期货一手是多少(商品期货一手是多少吨)
- 【飞行器】基于matlab四旋翼飞行器三维动态仿真【含Matlab源码 269期】
- [leetcode] 64 : 二进制求和
- 单片机入门(单片机基本知识及Keil软件的基本使用)--适合初学者
热门文章
- dayjs​​​​​​​文档
- 数据库 - 事务管理(ACID)隔离级别 事务传播行为
- 理解大型分布式网站你必须知道这些概念
- hashCode和identityHashCode的区别你知道吗?
- (一)Web Service——基本概念
- webpack打包发布
- ubuntu 13.04 mysql_Ubuntu13.04 下MySQL5.6安装过程
- php oracle 无查询结果,php - Oracle Insert查询不起作用,也不会抛出任何错误 - 堆栈内存溢出...
- MySQL事务管理+安全管理+MySQL数据类型
- 二叉堆的操作总结(insert+deleteMin+increaseKey+decreaseKey+percolateDown+percolateUp)