java附加属性_Java 9附加流
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附加流相关推荐
- java缓冲流 复制文件_java使用缓冲流复制文件的方法
本文实例为大家分享了java使用缓冲流复制文件的具体代码,供大家参考,具体内容如下 [1] 程序设计 /*------------------------------- 1.缓冲流是一种处理流,用来加 ...
- java文件与流_Java文件和流深入
1.什么是数据流? 数据流是指所有的数据通信通道.有两类流,InputStream and OutputStream,Java中每一种流的基本功能依赖于它们.InputStream用于read,Out ...
- JAVA mac系统io文件流_Java IO流基础1--IO的分类体系与文件流
什么是IO流 Java中的IO 了解什么是IO流之前,要先知道什么是IO.IO,就是in和out(即输入和输出),指应用程序和外部设备之间的数据传递,常见的外部设备包括文件.管道.网络连接等. 流的概 ...
- Java继承_Java面试题总结(一)
1.JDK和JRE有什么区别? JDK:Java 的开发工具包,提供了 Java 的开发环境和运行环境 JRE:Java 的运行环境,为 Java 的运行提供了所需环境 具体来说:JDK 其实包含了 ...
- java之十 高级IO流
视频课堂:https://edu.csdn.net/course/play/8222 java.io定义的输入/输出类列于下表: ObjectInputStream.GetField和ObjectOu ...
- Java第二十八天——杂七杂八的流 多线程
Java第二十八天--杂七杂八的流 多线程 一.杂七杂八的流 1._序列化流和反序列化流的概述和使用(理解) A:序列化流的概述 所谓的序列化:就是把对象通过流的方式存储到文件中.注意:此对象 要 ...
- Java基础:常用IO流
1. 数据流 1.1 概述 数据流是操作基本数据类型的流,分为数据输入流,数据输出流. 1.2 数据输入流 1.DataInputStream:数据输出流允许应用程序以适当方式将基本 Java 数据类 ...
- java调用easyxml接口_【技术教程】如何通过Java程序调用RTSP拉流协议视频平台EasyNVR程序接口?...
原标题:[技术教程]如何通过Java程序调用RTSP拉流协议视频平台EasyNVR程序接口? RTSP协议视频平台EasyNVR经过多年的积累,已经是一套成熟且完善的视频平台了,用户可以通过网页直接访 ...
- java 爬虫_Java原生代码实现爬虫(爬取小说)
Java也能做爬虫. 现在提到爬虫人第一个想到的就是python,其实使用Java编写爬虫也是很好的选择,Java成熟的爬虫框架很多,下面给大家展示一个使用Java基础语言编写的爬取小说的案例: 实现 ...
最新文章
- android标尺自定义view,android尺子的自定义view——RulerView详解
- win11系统正式版介绍
- 【转】Eclipse下支持编写HTML/JS/CSS/JSP页面的自动提示
- 单片机c语言中flag用法,单片机中定义flag有啥作用flag=1和flag=0都是什么意思
- (1)CC3200学习之blinky导入后报编译器版本错误
- 《物联网技术》课程笔记——第一章 物联网概述
- Hexo | yilia主题安装
- 火影忍者宇智波鼬动态壁纸带给大家
- Apollo星火计划学习笔记——Apollo速度规划算法原理与实践
- AS百度地图定位APP
- python简易BMI测体重
- 如何把 Node.js 嵌入自己的项目中
- 【答学员问】面试被拒后HR又一次打电话问,是否可以去上班?
- CF1066D Boxes Packing
- MySQL中Left Join用法
- Silverlight 游戏开发小技巧:星球大战字幕效果
- linux建分区以cylinder,Linux添加新硬盘,fdisk新建分区
- 全屋网络无死角,华为凌霄技术如何让你实现真正的Wi-Fi自由?
- proteus中的各类开关及其使用
- 斯蒂文斯理工学院的计算机专业,斯蒂文斯理工学院
热门文章
- NOIP2020洛谷P7115:移球游戏(分治)
- P7294-[USACO21JAN]Minimum Cost Paths P【单调栈】
- P4922-[MtOI2018]崩坏3?非酋之战!【dp】
- P3901-数列找不同【模拟】
- nssl1216-码灵鼠【数学】
- P2261-[CQOI2007]余数求和【数论,约数】
- 【贪心】Sunscreen(poj 3614/luogu 2887)
- 【线段树】开关(luogu 3870)
- Vue.js 定义组件模板的七种方式
- SpringMVC表单验证器的使用