java附加属性

Java 9即将发布! 它不仅仅是Jigsaw项目 。 (我也很惊讶。)它给平台带来了很多小的变化,我想一一看一下。 我将标记所有这些帖子,您可以在这里找到它们。

让我们从…开始

Streams学习了两个新技巧。 第一个处理前缀,流现在可以理解前缀。 我们可以使用谓词来测试流的元素,从一开始就可以使用或删除它们,直到第一个未通过测试为止。

Stream :: takeWhile

让我们先来看一下take:

Stream<T> takeWhile(Predicate<? super T> predicate);

在有序流上调用它会返回一个新的流,该流包含通过谓词的元素, 直到第一个失败 。 它有点像过滤器,但是一旦第一个元素失败了谓词,它就会切断流。 用它的话来说,它从流中获取元素,而谓词在不再存在时就保持并停止。

让我们来看一个例子:

Stream.of("a", "b", "c", "", "e").takeWhile(s -> !String.isEmpty(s));.forEach(System.out::print);Console: abc

容易吧? 请注意,即使e通过了谓词,e也不是返回流的一部分。 但是,它从未经过测试,因为takeWhile是在空字符串之后完成的。

前缀

为了确保我们了解文档 ,让我们了解术语。 从流的第一个元素开始的有序流的子序列称为prefix

Stream<String> stream = Stream.of("a", "b", "c", "d", "e");
Stream<String> prefix = Stream.of("a", "b", "c");
Stream<String> subsequenceButNoPrefix = Stream.of("b", "c", "d");
Stream<String> subsetButNoPrefix = Stream.of("a", "c", "b");

takeWhile操作将返回最长的前缀 ,该前缀仅包含通过谓词的元素。

前缀可以为空,因此如果第一个元素使谓词失败,它将返回空流。 相反,前缀可以是整个流,如果所有元素都通过谓词,则操作将返回该前缀。

订购

谈论前缀仅对有序流有意义。 那么对于无序的人会发生什么呢? 与流一样,故意不指定行为以启用高性能实现。

从无序流中获取将返回那些通过谓词的元素的任意子集。 除非它们全部都执行,否则它将始终返回整个流。

并发

从有序并行流中获取并不是最好的主意。 不同的线程必须配合以确保返回最长的前缀。 这种开销可能会降低性能,以至于使流顺序变得更有意义。

发布时间由安迪·亚瑟在CC-BY 2.0 。

流:: drop

接下来是dropWhile:

Stream<T> dropWhile(Predicate<? super T> predicate);

它与takeFirst恰好相反:在有序流上调用它将返回一个新的元素,该元素包含使谓词失败的第一个元素和所有后续的元素。 或者,更接近其名称,它在谓词成立的同时丢弃元素并返回其余的元素。

时间为例:

Stream.of("a", "b", "c", "de", "f").dropWhile(s -> s.length <= 1);.forEach(System.out::print);Console: def

请注意,即使它不通过谓词,流也包含f。 与之前类似,操作在第一个字符串使谓词失败(在这种情况下为ef)之后停止。

在无序流上调用该操作将删除那些无法通过谓词的元素的子集。 除非所有人都这样做,否则它将始终返回空流。 我们上面所说的有关术语和并发性的所有其他内容也适用于此。

流:: ofNullable

那真的很琐碎。 与其讨论,不如让它实际运行:

long one = Stream.ofNullable("42").count();
long zero = Stream.ofNullable(null).count();

你答对了? 除非它为null,否则它将使用给定的元素创建一个流,在这种情况下,该流为空。 打哈欠!

不过,它有其用例。 以前,如果某个邪恶的API给您提供了一个可能为null的实例,则开始在该实例可以提供的流上开始操作是circuit回的:

// findCustomer can return null
Customer customer = findCustomer(customerId);Stream<Order> orders = customer == null? Stream.empty(): customer.streamOrders();
// do something with stream of orders ...// alternatively, for the Optional lovers
Optional.ofNullable(customer).map(Customer::streamOrders).orElse(Stream.empty(). // do something with stream of orders

现在情况变得更好了:

// findCustomer can return null
Customer customer = findCustomer(customerId);Stream.ofNullable(customer).flatMap(Customer::streamOrders). // do something with stream of orders

反射

我们已经看到了takeWhile如何返回通过谓词的元素,并在第一个元素失败时将流切断。 相反,当第一个元素未通过谓词时,dropWhile也会剪切流,但在其后将返回该谓词。

作为一个告别,让我们看一个最后的示例,在该示例中,我们从HTML文件的meta元素流式传输所有行:

Files.lines(htmlFile).dropWhile(line -> !line.contains("<meta>").skip(1).takeWhile(line -> !line.contains("</meta>")

我们还了解了ofNullable。 我不知道为什么看起来如此熟悉? 是的,当然是可选的! 巧合的是,我接下来会介绍。 :)

敬请关注!

翻译自: https://www.javacodegeeks.com/2016/06/java-9-additions-stream.html

java附加属性

java附加属性_Java 9附加流相关推荐

  1. java缓冲流 复制文件_java使用缓冲流复制文件的方法

    本文实例为大家分享了java使用缓冲流复制文件的具体代码,供大家参考,具体内容如下 [1] 程序设计 /*------------------------------- 1.缓冲流是一种处理流,用来加 ...

  2. java文件与流_Java文件和流深入

    1.什么是数据流? 数据流是指所有的数据通信通道.有两类流,InputStream and OutputStream,Java中每一种流的基本功能依赖于它们.InputStream用于read,Out ...

  3. JAVA mac系统io文件流_Java IO流基础1--IO的分类体系与文件流

    什么是IO流 Java中的IO 了解什么是IO流之前,要先知道什么是IO.IO,就是in和out(即输入和输出),指应用程序和外部设备之间的数据传递,常见的外部设备包括文件.管道.网络连接等. 流的概 ...

  4. Java继承_Java面试题总结(一)

    1.JDK和JRE有什么区别? JDK:Java 的开发工具包,提供了 Java 的开发环境和运行环境 JRE:Java 的运行环境,为 Java 的运行提供了所需环境 具体来说:JDK 其实包含了 ...

  5. java之十 高级IO流

    视频课堂:https://edu.csdn.net/course/play/8222 java.io定义的输入/输出类列于下表: ObjectInputStream.GetField和ObjectOu ...

  6. Java第二十八天——杂七杂八的流 多线程

    Java第二十八天--杂七杂八的流 多线程 一.杂七杂八的流 1._序列化流和反序列化流的概述和使用(理解) A:序列化流的概述 ​ 所谓的序列化:就是把对象通过流的方式存储到文件中.注意:此对象 要 ...

  7. Java基础:常用IO流

    1. 数据流 1.1 概述 数据流是操作基本数据类型的流,分为数据输入流,数据输出流. 1.2 数据输入流 1.DataInputStream:数据输出流允许应用程序以适当方式将基本 Java 数据类 ...

  8. java调用easyxml接口_【技术教程】如何通过Java程序调用RTSP拉流协议视频平台EasyNVR程序接口?...

    原标题:[技术教程]如何通过Java程序调用RTSP拉流协议视频平台EasyNVR程序接口? RTSP协议视频平台EasyNVR经过多年的积累,已经是一套成熟且完善的视频平台了,用户可以通过网页直接访 ...

  9. java 爬虫_Java原生代码实现爬虫(爬取小说)

    Java也能做爬虫. 现在提到爬虫人第一个想到的就是python,其实使用Java编写爬虫也是很好的选择,Java成熟的爬虫框架很多,下面给大家展示一个使用Java基础语言编写的爬取小说的案例: 实现 ...

最新文章

  1. android标尺自定义view,android尺子的自定义view——RulerView详解
  2. win11系统正式版介绍
  3. 【转】Eclipse下支持编写HTML/JS/CSS/JSP页面的自动提示
  4. 单片机c语言中flag用法,单片机中定义flag有啥作用flag=1和flag=0都是什么意思
  5. (1)CC3200学习之blinky导入后报编译器版本错误
  6. 《物联网技术》课程笔记——第一章 物联网概述
  7. Hexo | yilia主题安装
  8. 火影忍者宇智波鼬动态壁纸带给大家
  9. Apollo星火计划学习笔记——Apollo速度规划算法原理与实践
  10. AS百度地图定位APP
  11. python简易BMI测体重
  12. 如何把 Node.js 嵌入自己的项目中
  13. 【答学员问】面试被拒后HR又一次打电话问,是否可以去上班?
  14. CF1066D Boxes Packing
  15. MySQL中Left Join用法
  16. Silverlight 游戏开发小技巧:星球大战字幕效果
  17. linux建分区以cylinder,Linux添加新硬盘,fdisk新建分区
  18. 全屋网络无死角,华为凌霄技术如何让你实现真正的Wi-Fi自由?
  19. proteus中的各类开关及其使用
  20. 斯蒂文斯理工学院的计算机专业,斯蒂文斯理工学院

热门文章

  1. NOIP2020洛谷P7115:移球游戏(分治)
  2. P7294-[USACO21JAN]Minimum Cost Paths P【单调栈】
  3. P4922-[MtOI2018]崩坏3?非酋之战!【dp】
  4. P3901-数列找不同【模拟】
  5. nssl1216-码灵鼠【数学】
  6. P2261-[CQOI2007]余数求和【数论,约数】
  7. 【贪心】Sunscreen(poj 3614/luogu 2887)
  8. 【线段树】开关(luogu 3870)
  9. Vue.js 定义组件模板的七种方式
  10. SpringMVC表单验证器的使用