Java关于JDK1.8新特性的Stream流
作者:码农飞哥 发布时间:2021-06-02 11:36:35
目录
Java 的Stream流
一、定义
二、操作的特征
三、代码示例
1、生成流
2、forEach 迭代
3、limit方法用于获取指定数量的流
4、map
5、sorted
6、并行(parallel)程序
7、Collectors
8、转化(将枚举类转成map)
Java 的Stream流
一、定义
JDK1.8 中增加了Stream流,Stream流是一个来自数据源的元素队列并支持聚合操作。元素是特定类型的对象,形成一个队列,Java中的Stream并不会存储元素,而是按需计算数据源是流的来源,可以使集合,数组,I/O channel,生成器generator等。聚合操作类似SQL语句一样的操作,比如filter
,map
,reduce
,match
,sorted
等
二、操作的特征
中间的操作都会返回流对象本身,这样多个操作可以串联成一个管道,如同流式风格
内部迭代:以前对集合的遍历是通过Iterator或者For-Each的方式,显式的在集合外部进行迭代,这叫做外部迭代,而Stream流式内部迭代。
三、代码示例
1、生成流
如下代码的意思是,首先创建一个集合,然后过滤出所有不为空的元素,重新组成一个集合
List<String> stringList = Arrays.asList("abc", "", "bc", "efg", "abcd", "");
List<String> strings = stringList.stream().filter(string -> StringUtils.isNotBlank(string)).collect(Collectors.toList());
System.out.println("*********过滤后的集合是"+strings);
2、forEach 迭代
strings.forEach(System.out::println);
3、limit方法用于获取指定数量的流
如下就是获取一个长度为10的流。
Random random = new Random();
random.ints().limit(10).forEach(System.out::println);
4、map
map方法用于映射每个元素,以下代码片段使用map输出元素对应的平方数
vList<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5, 8, 9);
//获取对应的平方数
List<Integer> integers = numbers.stream().map(i -> i * i).distinct().collect(Collectors.toList());
System.out.println("*********获取对应的平方数"+integers);
5、sorted
sorted方法用于对流进行排序
如下,就是按照元素的大小进行排序
List<Integer> orgList = Arrays.asList(10, 9, 8, 7, 6, 13, 16, 0, 1, 2);
List<Integer> sortedList = orgList.stream().sorted().collect(Collectors.toList());
System.out.println("*********排序后集合是"+sortedList);
6、并行(parallel)程序
List<String> emptyList = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "");
//获取空字符串的数量
long count = emptyList.parallelStream().filter(string -> string.isEmpty()).count();
System.out.println("*****集合中的空字符串个数=" + count);
7、Collectors
Collectors类实现了很多归约操作,例如将流转换成集合和集合元素,Collectors可用于返回列表或字符串
List<String> orgCollectors = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
List<String> filtered = orgCollectors.stream().filter(string -> !string.isEmpty())
.collect(Collectors.toList());
System.out.println("筛选列表:" + filtered);
String mergedString = stringList.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(","));
System.out.println("合并字符串:" + mergedString);
统计:
//统计
List<Integer> orgNums = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
IntSummaryStatistics statistics = numbers.stream().mapToInt((x) -> x).summaryStatistics();
System.out.println("列表中最大的数:" + statistics.getMax());
System.out.println("列表中最小的数:" + statistics.getMin());
System.out.println("所有数之和:" + statistics.getSum());
System.out.println("平均数:" + statistics.getAverage());
8、转化(将枚举类转成map)
将一个枚举类转成一个map,使用的示例可以参考下方:
Map<Integer, String> disableFlagMap = Arrays.stream(DisableFlagEnum.values()).collect(Collectors.toMap(p -> p.getCode(), p -> p.getDesc()));
完整的代码是:
public enum DisableFlagEnum {
NORMAL(0, "正常"),
DELETE(1, "已删除");
private Integer code;
private String desc;
DisableFlagEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
public Integer getCode() {
return code;
}
public String getDesc() {
return desc;
}
public static String getDesc(Integer code) {
Map<Integer, String> disableFlagMap = Arrays.stream(DisableFlagEnum.values()).collect(Collectors.toMap(p -> p.getCode(), p -> p.getDesc()));
return disableFlagMap.get(code);
}
}
demo的运行结果:
总结:
本文首先介绍了JDK1.8中的Stream流,Stream流是是一个来自数据源的元素队列并支持聚合操作。它的特点就是中间过程不会存储数据,不会改变数据源本身。接着介绍了stream的使用示例,stream流的使用一般是要结合函数式接口使用的。
来源:https://blog.csdn.net/u014534808/article/details/104372832
猜你喜欢
- 枚举的定义1.题目枚举是JAVA 5.0后增加的一个重要类型。可以用来表示一组取值范围固定的变量。使用enum关键字,可以定义枚举类型。实现
- import java.io.File;import java.io.FileNotFoundException;import java.i
- 本文实例讲述了Java设计模式之工厂模式。分享给大家供大家参考,具体如下:一、 简单工厂先来思考一个问题。我们平时写程序时,会有这种情况,A
- 经过上一篇的介绍,相信小伙伴们已经按奈不住内心对springboot的向往,本篇我将继续向小伙伴介绍springboot配置文件的配置,已经
- 一、业务需求实现省份与城市的二级联动二、实现效果三、代码实现1. province_city.jsp前端界面实现<%@ p
- 以上是集成测试后的Jprofiler演示效果图今晚想在IDEA中集成一下JProfiler11(现在有12版本了)工具,去网上看了下都是老版
- 一、前言我们经常会遇到业务想看debug日志的问题,但是debug日志频繁打印会对日志查看有影响,且日志多对系统也会有一定的压力,因此,如果
- 一.关于数组的特点1.在Java中,无论使用数组或集合,都有边界检查。如果越界操作就会得到一个RuntimeException异常。2.数组
- 小伙伴私信我说想要研究下Spring的源码,想让我出一期教程来实现IDEA导入Spring源码,今天它来了~版本 :IDEA 2020.2.
- 目录一、什么是 RUNNABLE?二、与传统的ready状态的区别三、与传统的running状态的区别四、当I/O阻塞时五、如何看待RUNN
- java 算法之归并排序详解一、思想 归并排序:将一个数组排序,可以先(递归地)将它分成两半部份分别排序,然后将结果归并起来; &
- “反射”其实就是利用程序集的元数据信息。 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间。1、假设你要
- 最近在做项目的时候有用到对两个集合中的元素进行对比求其交集的情况,因为涉及到的数据量比较大,所以在进行求两个集合中元素交集的时候,就应该考虑
- 前言DataGridView是开发Winform的一个列表展示,类似于表格。学会下面的基本特征用法,再辅以经验,基本功能开发没问题。基本的数
- 一、前言前面我们讲了Java的入门知识,相信许多小伙伴对Java基础有一个大概的认识了,这也为我们后续的学习打下了基础,所以我们可以继续学习
- 井字棋游戏要求在3乘3棋盘上,每行都相同或者每列都相同再或者对角线相同,则胜出.因此我们可以使用一个二维数组来表示棋盘,判断胜负只需要判断数
- 一、参数管理在编程系统中,为了能写出良好的代码,会根据是各种设计模式、原则、约束等去规范代码,从而提高代码的可读性、复用性、可修改,实际上个
- 定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。设计初衷:
- Linux下的五种I/O模型1)阻塞I/O(blocking I/O)2)非阻塞I/O (nonblocking I/O)3) I/O复用(
- 今天给大家介绍一下SpringBoot中JPA的一些常用操作,例如:增删改查、分页、排序、事务操作等功能。下面先来介绍一下JPA中一些常用的