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 不会存储元素. 数据源 流的来源. 可 ... 
随机推荐
- Thread 另类用法,如何执行一段可能死锁/卡死/死循环的代码
			场景与需求 需要执行一段第三方的代码,这段代码可能死锁/卡死/死循环,在超时之后,如果没有结束,则认为任务执行失败,退出执行. 实现方案1:使用 Task 超时 实现方法参考: https://www ... 
- SpringBoot+Swagger整合
			0.引言及注意事项 Swagger是一个接口文档工具,依照Swagger可以0配置开发接口.不过要注意,Swagger是基于SpringBoot1.47版本开发的,而SpringBoot现在基本都是是 ... 
- iOS开发之--为UITextField监听数值变化的三种方法
			项目中有个验证码输入直接验证跳转页面,用的RAC来监听textfield的输入值,如下: @weakify(self); [self.codeView.textField.rac_textSignal ... 
- 搞NDK开发
			1.哪些场景下要用到NDK开发? 跨平台的库,如FFmpeg, skip,weex, 加固,防逆向 签名校验 图片压缩 音视频解码 OpenGL ES 高级特效 热修复 andfix 人脸识别 fac ... 
- undefined reference to `BN_new'
			出现如下错误 undefined reference to `BN_CTX_new' undefined reference to `BN_new' undefined reference to `B ... 
- SQLAlchemy 应用创建
			1.首先创建app文件夹 同django 创建app 一样 创建文件 在创建的views中写入两个蓝图函数为了操作数据库的增删改查 acc.py from flask import Blueprint ... 
- ssh 到服务器然后输入中文保存到本地变成乱码
			很有可能是 默认的编码导致的 尝试执行 echo $LANG 如果是 en_US vim 输入中文有较大概率是 GBK 编码 尝试把这个加入到 ~/.bashrc export LANG=zh_CN. ... 
- JVM 启动参数,共分为3类
			JVM 启动参数,共分为3类: 类别 说明 标准参数(-) 所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 非标准参数(-X) 这些参数不是虚拟机规范规定的.因此,不是所有VM的实现(如:H ... 
- IDEA写vue项目出现红色波浪线警告如何解决??
			1.看图 2.希望对大家有帮助,只要修改了这个就可以,如有任何问题都可以留言,谢谢大家 2019-09-1923:54:11 作者:何秀好 
- Selenium获取页面指定元素个数
			测试需求: 获取页面中下拉框个数,并验证是否与预期个数一致 方法1:因下拉框的tagname属性值为select,可通过获取标签为select的元素来获取下拉框个数 List<WebElem ... 
