少年击剑更吹箫,剑气箫心一例消。这篇文章主要讲述Java基础之Stream流(JDK1.8新特性)相关的知识,希望能为你提供帮助。
定义JDK1.8 中增加了Stream流,Stream流是一个来自数据源的元素队列并支持聚合操作。
元素是特定类型的对象,形成一个队列,java中的Stream并不会存储元素,而是按需计算
数据源是流的来源,可以使集合,数组,I/O channel,生成器generator等。
聚合操作类似SQL语句一样的操作,比如filter,map,reduce,match,sorted等
操作的特征1.中间的操作都会返回流对象本身,这样多个操作可以串联成一个管道,如同流式风格
2.内部迭代:以前对集合的遍历是通过Iterator或者For-Each的方式,显式的在集合外部进行迭代,这叫做外部迭代,而Stream流式内部迭代。
代码示例
生成流
如下代码的意思是,首先创建一个集合,然后过滤出所有不为空的元素,重新组成一个集合
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);
forEach 迭代
strings.forEach(System.out::println);
limit方法用于获取指定数量的流
如下就是获取一个长度为10的流。
Random random = new Random();
random.ints().limit(10).forEach(System.out::println);
map
map方法用于映射每个元素,以下代码片段使用map输出元素对应的平方数
List< 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);
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);
并行(parallel)程序
List< String> emptyList = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "");
//获取空字符串的数量
long count = emptyList.parallelStream().filter(string -> string.isEmpty()).count();
System.out.println("*****集合中的空字符串个数=" + count);
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());
转化(将枚举类转成map)
将一个枚举类转成一个map,使用的示例可以参考下方:
Map< Integer, String> disableFlagMap = Arrays.stream(DisableFlagEnum.values()).collect(Collectors.toMap(p -> p.getCode(), p -> p.getDesc()));
【Java基础之Stream流(JDK1.8新特性)】完整的代码是:
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 Integ
推荐阅读
- [ C++ ] 类与对象(下)日期类Date补充及流提取和流插入运算符重载
- HarmonyOS - 实现多设备协同
- 看漫画漫画柜mhgui,Python爬虫之神奇的eval,附赠一个压缩模块
- AI+科学计算-昇思MindSpore都给我们带来哪些惊喜()
- 数据仓库进阶 - 01 《阿里大数据之路》第二篇 数据模型篇
- Java 集合系列07--- HashMap详细介绍(源码解析)----新
- #导入Word文档图片# Linux下IO多路复用: Selectpollepoll
- 流水线中如何获取代码库分支信息
- vivo大规模 Kubernetes 集群自动化运维实践