Java8 新特性 Stream 无状态中间操作
无状态中间操作
中间无状态操作,可以在单个对单个的数据进行处理。比如:filter(过滤)一个元素的时候,也可以判断,比如map(映射)...
过滤 filter
映射 map
扁夹化 flatMap
遍厉 peek
过滤 filter
接收一个谓词断言,boolean Pridicate< T > 根据返回值类型来确定是否过滤这一条属性。
// 过滤 filter
@Test
public void filterTest() {
list.stream()
//过滤掉所有小于2000的商品
.filter(sku -> sku.getSkuPrice() > 2000)
.forEach(item ->
System.out.println(
JSON.toJSONString(
item.getSkuName()+item.getSkuPrice(),
true)));
/**
* 输出的结果
* "无人机4999.0"
* "VR一体机2299.0"
* "跑步机2699.0"
*/
映射 map
流支持map方法,接收一个Function< T,R > 函数型接口,这个方法会应用每个元素都,并且把他们映射成一个新的流。其实在上面的例子中已经用的非常的多了,比如说,接收一个SKu类型的流,但是经过map以后,返回的是String的流。
//映射 map
@Test
public void mapTest() {
list.stream()
//用方法引用取出来sku中的所有的商品名称
.map(Sku::getSkuName)
.forEach(item -> System.out.println(item));
/**
* 无人机
* VR一体机
* 纯色衬衫
* 牛仔裤
* 跑步机
* Java编程思想
* Java核心技术
* 算法
* TensorFlow进阶指南
*/
}
扁平化 flatMap
flatMap方法就是让你一个流中的每个值都换成另一个流,把所有的流都边接成为一个流:例
//扁夹化 flatMap
@Test
public void flatMap() {
List<String> words = Arrays.asList("Java 8", "Lambdas", "In", "Action");
List<String[]> listStringArrays = words.stream()
//分割每一个单词
.map(word -> word.split(""))
//对所有的元素去重
.distinct()
//收集成list集合
.collect(Collectors.toList());
listStringArrays.forEach(arr ->
System.out.println(Arrays.toString(arr)));
/**
* 非扁平化
* 这是把每一个数组当成了一整个元素,
* 然后对一整个数组进行去重,
* 如果数组没有重复的就不会去重
* [J, a, v, a, , 8]
* [L, a, m, b, d, a, s]
* [I, n]
* [A, c, t, i, o, n]
*/
List<String> listString = words.stream()
//映射成String[]数组流
.map(word -> word.split(""))
//扁平化
.flatMap(Arrays::stream)
//去重
.distinct()
//排序
.sorted()
//收集
.collect(Collectors.toList());
listString.forEach(System.out::println);
/**
* 扁平化是把所有的数组map映射出来的数组流
* 转换成一个流,而不是一个数组流,这样就可以去重了
* 8 A I J L a b c d i m n o s t v
*/
}
遍厉 peek
和终端操作一样,都是进行循环的。用的是peek方法,里面接收一个comsumer方法。这个方法最能体现无状态中间操作的:
//遍厉 peek
@Test
public void peekTest() {
list.stream()
//获取商品名称
.map(Sku::getSkuName)
//遍厉
.peek(skuName -> System.out.println(skuName + " peek"))
.forEach(System.out::println);
/**
* 看结果是和forEach效替进行输出,而不是peek输出之后再进行forEach
* 说明,peek不用在所有的元素的基础上进行操作,只用消费就行了
*
* 无人机 peek
* 无人机
* VR一体机 peek
* VR一体机
* 纯色衬衫 peek
* 纯色衬衫
* 牛仔裤 peek
* 牛仔裤
* 跑步机 peek
* 跑步机
* Java编程思想 peek
* Java编程思想
* Java核心技术 peek
* Java核心技术
* 算法 peek
* 算法
* TensorFlow进阶指南 peek
* TensorFlow进阶指南
*/
list.stream()
//获取商品名称
.map(Sku::getSkuName)
//遍厉
.peek(skuName -> System.out.println(skuName + " peek"))
//排序
.sorted()
.forEach(System.out::println);
/**
* 这个地方就是加了一个有状态中间操作
* 因为排序必须在所有的数据基础上进行操作的
*
* 无人机 peek
* VR一体机 peek
* 纯色衬衫 peek
* 牛仔裤 peek
* 跑步机 peek
* Java编程思想 peek
* Java核心技术 peek
* 算法 peek
* TensorFlow进阶指南 peek
* Java核心技术
* Java编程思想
* TensorFlow进阶指南
* VR一体机
* 无人机
* 牛仔裤
* 算法
* 纯色衬衫
* 跑步机
*/
}
细节决定成败!
个人愚见,如有不对,恳请扶正!
Java8 新特性 Stream 无状态中间操作的更多相关文章
- Java8 新特性 Stream() API
新特性里面为什么要加入流Steam() 集合是Java中使用最多的API,几乎每一个Java程序都会制造和处理集合.集合对于很多程序都是必须的,但是如果一个集合进行,分组,排序,筛选,过滤...这些操 ...
- Java8 新特性 Stream 非短路终端操作
非短路终端操作 Java8 新特性 Stream 练习实例 非短路终端操作,就是所有的元素都遍厉完,直到最后才结束.用来收集成自己想要的数据. 方法有: 遍厉 forEach 归约 reduce 最大 ...
- Java8 新特性 Stream 短路终端操作
短路终端操作 Java8 新特性 Stream 练习实例 传入一个谓词,返回传为boolean,如果符合条件,则直接结束流. 匹配所有 allMatch 任意匹配 anymMatch 不匹配 none ...
- 这可能是史上最好的 Java8 新特性 Stream 流教程
本文翻译自 https://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/ 作者: @Winterbe 欢迎关注个人微信公众 ...
- java8新特性--Stream的基本介绍和使用
什么是Stream? Stream是一个来自数据源的元素队列并可以进行聚合操作. 数据源:流的来源. 可以是集合,数组,I/O channel, 产生器generator 等 聚合操作:类似SQL语句 ...
- Java8新特性Stream流应用示例
Java8新特性介绍 过滤集合 List<String> newList = list.stream().filter(item -> item != null).collect(C ...
- Java8 新特性 Stream 练习实例
练习实例 配合Java8 新特性 Steam() API 使用 //没有写get set 构造方法 public class Sku { private Integer skuId; private ...
- 漫漫人生路-学点Jakarta基础-Java8新特性 Stream/Lambda
背景 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk dat ...
- Java8 新特性Stream 的学习和使用方法
流(Stream) 流是java 8 中新引入的特性,用来处理集合中的数据,Stream 是一个来自数据源的元素队列并支持聚合操作. Java 中 Stream 不会存储元素. 数据源 流的来源. 可 ...
随机推荐
- JavaScript addEventListener()事件监听方法
addEventListener()方法将事件处理程序附加到指定的元素. addEventListener()方法将事件处理程序附加到元素,而不覆盖现有的事件处理程序. 您可以向一个元素添加许多事件处 ...
- chrome安装react-devtools开发工具
我开始安装react-devtools的时候 百度了一波,都是写的不清不楚,官网又都是英文的 也不是完全理解,经过一番折腾出来以后,写个文档记录一下,也可避免新手首次安装走弯路 我安装react-de ...
- 新手入门必看:VectorDraw 常见问题整理大全(二)
VectorDraw Developer Framework(VDF)是一个用于应用程序可视化的图形引擎库.有了VDF提供的功能,您可以轻松地创建.编辑.管理.输出.输入和打印2D和3D图形文件.该库 ...
- Python 安装第三方库,pip install 安装慢,安装不上的解决办法
今天来说一下,有些刚刚接触python的朋友,在使用pip install安装python 第三方库的过程中 会出现网速很慢,或者是安装下载到中途,停止,卡主,或者是下载报错等问题.如下图: 还有一些 ...
- Oracle 11G空表无法导出处理
通过exp进行数据导出的时候,如果表的数据为空,则会出现警告,并且表也不会导出,不利于数据恢复. 可以通过以下方法进行解决: 一.使用ALLOCATE EXTENT,可以导出之前已经存在的空表 --查 ...
- mybatis中的分页插件
1.Mybatis的分页plugin实现原理 2.具体步骤 第一步.导入到pom.xml文件中依赖包 第二步.配置插件(必需) 在mybatisConfig.xml文件中配置以下代码 代码位置:在en ...
- 第16节_BLE协议GAP层
学习资料:官方手册 Vol 3: Core System Package [Host volume] Part C: Generic Access Profile 下面这个图是BLE协议各层跟医院的各 ...
- VSCode变换python的调试解释器
假如一个电脑上有多个Python的环境,想要设置不同的python解释器用于调试. VSCode 的设置,是通过.json的文本来配置的.打开文本的方式: 打开后的文件如下所示: 可以试试“new s ...
- centos 下 gradle 编译打包 apk
由于Jenkins 装在centos环境下,想实现Android程序的编译,只能通过gradle 命令去打包版本apk,以下记录了如何在centos下使用gradle 打包apk 一.安装 gradl ...
- 集合(List、Set、Map)
一.集合与数组 数组:长度固定,数组元素可以是基本类型,也可以是对象.不适合在对象数量未知的情况下使用. 集合:(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. Java集合类存放 ...