无状态中间操作

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 无状态中间操作的更多相关文章

  1. Java8 新特性 Stream() API

    新特性里面为什么要加入流Steam() 集合是Java中使用最多的API,几乎每一个Java程序都会制造和处理集合.集合对于很多程序都是必须的,但是如果一个集合进行,分组,排序,筛选,过滤...这些操 ...

  2. Java8 新特性 Stream 非短路终端操作

    非短路终端操作 Java8 新特性 Stream 练习实例 非短路终端操作,就是所有的元素都遍厉完,直到最后才结束.用来收集成自己想要的数据. 方法有: 遍厉 forEach 归约 reduce 最大 ...

  3. Java8 新特性 Stream 短路终端操作

    短路终端操作 Java8 新特性 Stream 练习实例 传入一个谓词,返回传为boolean,如果符合条件,则直接结束流. 匹配所有 allMatch 任意匹配 anymMatch 不匹配 none ...

  4. 这可能是史上最好的 Java8 新特性 Stream 流教程

    本文翻译自 https://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/ 作者: @Winterbe 欢迎关注个人微信公众 ...

  5. java8新特性--Stream的基本介绍和使用

    什么是Stream? Stream是一个来自数据源的元素队列并可以进行聚合操作. 数据源:流的来源. 可以是集合,数组,I/O channel, 产生器generator 等 聚合操作:类似SQL语句 ...

  6. Java8新特性Stream流应用示例

    Java8新特性介绍 过滤集合 List<String> newList = list.stream().filter(item -> item != null).collect(C ...

  7. Java8 新特性 Stream 练习实例

    练习实例 配合Java8 新特性 Steam() API 使用 //没有写get set 构造方法 public class Sku { private Integer skuId; private ...

  8. 漫漫人生路-学点Jakarta基础-Java8新特性 Stream/Lambda

    背景 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk dat ...

  9. Java8 新特性Stream 的学习和使用方法

    流(Stream) 流是java 8 中新引入的特性,用来处理集合中的数据,Stream 是一个来自数据源的元素队列并支持聚合操作. Java 中 Stream 不会存储元素. 数据源 流的来源. 可 ...

随机推荐

  1. rabbitmq 实现多个消费队列

    1.将消费程序复制重新生成一个. 2.channel.BasicQos(0, 1, false); 空闲的先消费

  2. 【转载】Visual Studio2017中如何设置解决方案中的某个项目为启动项目

    在C#的应用程序开发过程中,一个完成的解决方案可能包含多个子项目,有时候需要设置某一个子项目为启动项目,在Visual Studio 2017集成开发工具中,设置解决方案中的某个项目为启动项目的操作方 ...

  3. ROW_NUMBER()实现分页

    1. 在数据表基础上面添加一个自增的一列记录行数(虚拟的实际数据库不存在,不会影响数据库结构)的列当然也顺便起一个别名(我这里起了一个rowNum) 2.由于rowNum是一个虚拟的.若直接使用会报' ...

  4. Spring事务部分知识点整理

    目录 1.数据库事务基础概念 2.Spring中注解事务的使用 3.Spring事务使用注意场景 1.数据库事务基础概念   数据库事务是对数据库一次一系列的操作组成的单元,可以包含增删改查或者只有单 ...

  5. 【已解决】git怎么合并多个分支到主干master

    git支持很多种工作流程,我们采用的一般是这样,远程创建一个主分支,本地每人创建功能分支,日常工作流程如下: 去自己的工作分支$ git checkout workbranch 工作.... 提交工作 ...

  6. MySQL的过滤(极客时间学习笔记)

    数据过滤 SQL的数据过滤, 可以减少不必要的数据行, 从而可以达到提升查询效率的效果. 比较运算符 在SQL中, 使用WHERE子句对条件进行筛选, 筛选的时候比较运算符是很重要. 上面的比较运算符 ...

  7. Fundebug前端异常监控插件更新至 1.9.0,支持监控 HTTP 慢请求

    摘要: 1.9.0新增 httpTimeout 配置选项,支持监控 HTTP 慢请求,同时修复了记录的 HTTP 响应时间偏小的 BUG. Fundebug提供专业的前端异常监控服务,可以第一时间捕获 ...

  8. JMETER 计数器的表现

    1.计数器在线程中表现(虚拟用户). 线程组使用4个线程即4个虚拟用户. 如果不勾选每用户独立跟踪计数器. 那么这个计数器将会累加4次. 计算结果为7. 勾选的情况. 这里我们可以看到 index 一 ...

  9. Linux进程管理 (篇外)内核线程简要介绍【转】

    转自:https://www.cnblogs.com/arnoldlu/p/8336998.html 关键词:kthread.irq.ksoftirqd.kworker.workqueues 在使用p ...

  10. 网络远程唤醒 WOL Magic Packet【转】

    转自:https://www.cnblogs.com/dcb3688/p/4608063.html Magic Packet Magic Packet白皮书介绍: The basic technica ...