Java9系列第6篇-Stream流API的增强

我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注。期待您能关注我,我将把java 9 写成一系列的文章,大概十篇左右,本文是第6篇。
本文带大家快速的了解一下在Java 9 种集合类Colleaction子类都发生了哪些比较有用的变化与增强。
在Java 9中对Java Util Stream的语法进行了优化和增强,下面我就和大家一起看一下有哪些比较有价值的使用方法。
1. Stream.takeWhile(Predicate)
在进行Stream流的管道数据处理的时候,提供的Predicate条件返回false之后,将跳过剩余的数据元素直接返回。在下面的示例中,一旦Predicate条件!"orange" .equals(s)返回false,则将跳过其他元素:
String[] fruits = {"apple", "banana", "orange", "mango", "peach"};
Stream<String> stream = Arrays.stream(fruits)
.takeWhile(s -> !"orange".equals(s));
stream.forEach(System.out::println);
控制台输出结果为,依次对数组中元素过滤,到orange元素满足了!"orange" .equals(s) === false,流式处理不再继续直接返回。
apple
banana
需要注意的是:对于无序Stream,如果存在多个与提供的Predicate匹配的元素(多个orange),则此操作返回值是不确定的。
这种方法看上去和Java 8中的Stream.filter()很相似,但是它们的不同之处在于filter()方法只是跳过了不匹配的元素,然后继续进行处理。然而takeWhile()方法在存在匹配项之后会跳过所有剩余的元素,有点像continue和break的区别。以下是具有相同流和Predicate的filter()方法示例:
String[] fruits = {"apple", "banana", "orange", "mango", "peach"};
Stream<String> stream = Arrays.stream(fruits).filter(s -> !"orange".equals(s));
stream.forEach(System.out::println);
控制台输出如下,只是把orange过滤掉了。
apple
banana
mango
peach
2.Stream.dropWhile(Predicate)
提供的Predicate条件在管道流中返回false之后,此元素后面的所有数据元素作为返回值返回。
String[] fruits = {"apple", "banana", "orange", "mango", "peach"};
Stream<String> stream = Arrays.stream(fruits)
.dropWhile(s -> !"orange".equals(s));
stream.forEach(System.out::println);
在上面示例中,一旦Predicate条件!"orange".equals(s) 返回false,管道流中剩余的元素将被接受(不被过滤),作为返回值返回:
orange
mango
peach
3.Stream Stream.iterate(T,Predicate,UnaryOperator)
一旦Predicate条件返回false,此方法将返回一个顺序流,该顺序流将停止迭代操作。T为初始值,迭代操作由UnaryOperator来提供
Stream<String> iterate = Stream.iterate("-",
s -> s.length() < 5, //Predicate条件
s -> s + "-"); //迭代操作
iterate.forEach(System.out::println);
控制台打印输出的结果,只输出四个横杠,到第五个的时候停止。这是由Predicate条件决定的。
-
--
---
----
4.Stream Stream.ofNullable(T)
此方法返回一个包含单个元素的顺序Stream。如果提供的元素为null,则此方法返回空Stream。当我们要将非空单个元素附加到流时,此方法很有用。例如:
String nullableItem = "peach";
Stream<String> stream = Stream.of("apple", "banana", "orange");
Stream<String> stream2 = Stream.concat(stream, Stream.ofNullable(nullableItem));
stream2.forEach(System.out::println);
控制台打印输出结果如下:
apple
banana
orange
peach
5.IntStream,LongStream和DoubleStream方法
下面的这些XxxStream类也具有与Stream类等效的方法(ofNullable()方法除外)。
IntStream.of(2, 4, 6, 8, 9, 10, 11)
.takeWhile(i -> i % 2 == 0)
.forEach(System.out::println); //2,4,6,8
IntStream.of(2, 4, 6, 8, 9, 10, 11)
.dropWhile(i -> i % 2 == 0)
.forEach(System.out::println); // 9,10,11
IntStream.iterate(0, i -> i < 10, i -> i + 1)
.forEach(System.out::print); // 0123456789
欢迎关注我的博客,里面有很多精品合集
- 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。
- 《手摸手教你学Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《实战前后端分离RBAC权限管理系统》
- 《实战SpringCloud微服务从青铜到王者》
- 《VUE深入浅出系列》
Java9系列第6篇-Stream流API的增强的更多相关文章
- Java9系列第7篇:Java.util.Optional优化与增强
我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...
- Java9系列第8篇-Module模块化编程
我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...
- Java8 Stream流API常用操作
Java版本现在已经发布到JDK13了,目前公司还是用的JDK8,还是有必要了解一些JDK8的新特性的,例如优雅判空的Optional类,操作集合的Stream流,函数式编程等等;这里就按操作例举一些 ...
- 【JDK8】Java8 Stream流API常用操作
Java版本现在已经发布到JDK13了,目前公司还是用的JDK8,还是有必要了解一些JDK8的新特性的,例如优雅判空的Optional类,操作集合的Stream流,函数式编程等等;这里就按操作例举一些 ...
- Java9系列第三篇-同一个Jar支持多JDK版本运行
我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...
- FreeRTOS系列第20篇---FreeRTOS信号量API函数
FreeRTOS的信号量包括二进制信号量.计数信号量.相互排斥信号量(以后简称相互排斥量)和递归相互排斥信号量(以后简称递归相互排斥量).我们能够把相互排斥量和递归相互排斥量看成特殊的信号量. 信号量 ...
- java8-Stream流API
一回顾与说明 经过前面发布的三章java8的博客,你就懂得了我们为什么要用Lamda表达式,Lamda表达式的原理与函数式接口的关系,从Lamda表达式到方法引用和构造引用. 想要学Stream流你必 ...
- Java9系列第九篇-对HTTP2协议的支持与非阻塞HTTP-API
在HTTP/1.1 发布了16 年之后,IETF在2015年终于通过了HTTP/2 协议.HTTP/2协议旨在降低延迟,满足当今时代对于信息响应时间的要求.在这篇文章中,我会简要的对HTTP/2协议进 ...
- java9系列第二篇-资源自动关闭的语法增强
我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...
随机推荐
- oracle之三资源管理
Oracle 资源管理 12.1 为什么要使用Oracle资源管理器 传统意义上,系统的资源分配是由OS来完成的,但是对于数据库资源,OS分配资源会带来一些问题: 以Linux为例,最为突出的一个问题 ...
- in多值优化
〇.问题 今天ocp群里有人问 SELECT * FROM table WHERE id IN(11,2,3,44,...) 在in里面有大量数据4000+,有什么 好的处理方式吗? 我的优化方案的总 ...
- 踩坑了,JDK8中HashMap依然会死循环!
是否你听说过JDK8之后HashMap已经解决的扩容死循环的问题,虽然HashMap依然说线程不安全,但是不会造成服务器load飙升的问题. 然而事实并非如此.少年可曾了解一种红黑树成环的场景,=v= ...
- 容器云平台No.5~企业级私有镜像仓库Harbor V2.02
镜像仓库 仓库,顾名思义,就是存放东西的地方,Docker仓库,理所当然,就是存放docker镜像的地方了. Docker仓库分公有仓库和私有仓库.共有仓库有hub.docker.com.gcr.io ...
- 快速上手spring
一.初始程序 1.在父类pom导入所需要的jar包 2.编写一个实体类 3.创建一个beans.xml,创建一个bean即创建一个user对象,可在bean内配置property即设置属性值 4.用测 ...
- 阿里云恶意软件检测比赛-第三周-TextCNN
LSTM初试遇到障碍,使用较熟悉的TextCNN. 1.基础知识: Embedding:将词的十进制表示做向量化 起到降维增维的作用 嵌入维度数量(New Embedding维度)的一般经验法则: e ...
- 大白话谈JVM的类加载机制
前言 我们很多小伙伴平时都是做JAVA开发的,那么作为一名合格的工程师,你是否有仔细的思考过JVM的运行原理呢. 如果懂得了JVM的运行原理和内存模型,像是一些JVM调优.垃圾回收机制等等的问题我们才 ...
- Emit动态生成代理类用于监控对象的字段修改
利用Emit动态生成代理对象监控对象哪些字段被修改,被修改为什么值 被Register的对象要监控的值必须是Virtual虚类型 必须使用CreateInstance创建对象 必须使用DynamicP ...
- macOS使用ABP.vNext Core开发CMS系统(一) 让程序跑起来
macOS使用ABP.vNext Core开发CMS系统(一) 让程序跑起来--2020年10月5日 国庆假期,陪老婆的同时也不能忘记给自己充充电,这不想搞个CMS系统,考虑自己的时间并不多,所以想找 ...
- LiteOS-任务篇-源码分析-删除任务函数
目录 前言 笔录草稿 源码分析 LOS_TaskDelete函数源码分析 完整源码 参考 链接 前言 20201009 LiteOS 2018 需要会通用链表 笔录草稿 源码分析 LOS_TaskDe ...