在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)以及更高版本中,所有内容都可以作为一个流相关推荐

  1. 棉花糖多少钱_如何在6.0棉花糖及更高版本中访问Android的正在运行的应用程序列表...

    棉花糖多少钱 In Android 5.x and below, accessing your list of running apps was simple-you'd jump into Sett ...

  2. 泽西岛2.9及更高版本中的声明式链接

    几个星期前几个月前,我正在寻找如何为Oracle Cloud项目设计新的REST API. 我计划要做的事情之一就是使用Marc Hadley在Jersey 1.x中创建的声明性链接注入. 可悲的是这 ...

  3. jdk11换jdk8版本_在JDK 9(以及8)以及更高版本中,所有内容都可以作为一个流

    jdk11换jdk8版本 在JDK 8中,我们终于可以使用流了,除了您使用的API无法产生流的时代之外,其他一切都很好. 然后,您最终编写了一个包装器类方法,该方法允许您将迭代器转换为Stream,因 ...

  4. 如何使用XE2及更高版本中提供的自定义皮肤(样式)功能

    1. 制作样式文件: 点击 XE2+ 的 IDE 菜单上的 Tools-->Bitmap Style Designer, 打开设计器. 为每个需要的元素设计好图片或颜色或字体. 最重要的是, 要 ...

  5. 停止、启动或重新启动 VMware vCenter Server Appliance 6.x 及更高版本上的服务 (2109887)

    停止.启动或重新启动 VMware vCenter Server Appliance 6.x 及更高版本上的服务 (2109887) https://kb.vmware.com/s/article/2 ...

  6. Android Studio TV开发教程(十五) Android N及更早版本中的建议

    Android Studio TV开发教程 (转自Android官网https://developer.android.com/training/tv/start) 文章源自:光谷佳武 https:/ ...

  7. ios 查找朋友 android,在 iOS 12 或更低版本中设置和使用“查找我的朋友”

    如果您使用的是 iOS 13.iPadOS.macOS Catalina 或更高版本,则"查找"App 已将"查找我的 iPhone"和"查找我的朋友 ...

  8. Dubbo 高危反序列化漏洞,存在远程代码执行风险,建议及时升级到2.7.7或更高版本!...

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 以下内容转载自安全客,原文链接:https://www. ...

  9. Maven编译项目时报错:不再支持源选项 5。请使用 6 或更高版本。 不再支持目标选项 1.5。请使用 1.6 或更高版本。

    在使用Maven编译项目时报错: 不再支持源选项 5.请使用 6 或更高版本. 不再支持目标选项 1.5.请使用 1.6 或更高版本. 在项目pom.xml文件中增加maven编译的jdk版本设置,m ...

最新文章

  1. php 计算一个字符串在另一个字符串中出现的次数
  2. mysql带AND关键字的多条件查询
  3. flot中文API(转载)
  4. 做python自动化得时候怎么添加断言_在编写Web自动化测试用例的时候,如何写断言使新手不解,严格意义上来讲,没有断言的自动化脚本不能叫测试用例。就像功能测试一样,当测试人员做了一些操作...
  5. python shutil模块用法实例分析_Python shutil模块用法实例分析
  6. 网络名称 转换 网络地址_网络地址转换| 计算机网络
  7. 用定时器控制灯的闪烁梯形图_用西门子PLC设计灯的闪烁的梯形图,就只要梯形图。...
  8. iOS h264硬编码
  9. Edge,IE浏览器 兼容模式设置
  10. 消息中间件选型分析:从 Kafka 与 RabbitMQ 对比
  11. 华院计算|切比雪夫,他带起了俄罗斯现代数学的发展
  12. Google搜索引擎的奥秘
  13. 不得不会的软件测试bug分析定位技巧
  14. 【论文阅读】Alignment-Robust Cancelable Biometric Scheme for Iris Verification
  15. 介绍一下当前使用的Oracle数据库自动化运维方式
  16. python实现音乐定时开关,模拟上下课铃声(含程序打包微小exe文件方法介绍)
  17. 商品期货一手是多少(商品期货一手是多少吨)
  18. 【飞行器】基于matlab四旋翼飞行器三维动态仿真【含Matlab源码 269期】
  19. [leetcode] 64 : 二进制求和
  20. 单片机入门(单片机基本知识及Keil软件的基本使用)--适合初学者

热门文章

  1. dayjs​​​​​​​文档
  2. 数据库 - 事务管理(ACID)隔离级别 事务传播行为
  3. 理解大型分布式网站你必须知道这些概念
  4. hashCode和identityHashCode的区别你知道吗?
  5. (一)Web Service——基本概念
  6. webpack打包发布
  7. ubuntu 13.04 mysql_Ubuntu13.04 下MySQL5.6安装过程
  8. php oracle 无查询结果,php - Oracle Insert查询不起作用,也不会抛出任何错误 - 堆栈内存溢出...
  9. MySQL事务管理+安全管理+MySQL数据类型
  10. 二叉堆的操作总结(insert+deleteMin+increaseKey+decreaseKey+percolateDown+percolateUp)