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、首先我们需要新建一个数据库表用于存放menu菜单项可包含的字段有id、父类id、n
- 本文实例为大家分享了Java实现坦克大战小游戏的具体代码,供大家参考,具体内容如下创作背景:n年前的学期末课题设计,从b站上学的,一个代码一
- ComparableComparable 是排序接口。若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Compa
- 前言最近一年多的时间陆续接触了一些对我来说陌生的语言,主要就是 Python 和 Go,期间为了快速实现需求只是依葫芦画瓢的撸代码;并没有深
- Java BlockingQueue接口java.util.concurrent.BlockingQueue表示一个可以存取元素,并且线程安
- AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合。其实AsyncTask并不是那么好,甚至有些糟糕。本文
- 上一篇简单介绍了SurfaceView的基本使用,这次就介绍SurfaceView与多线程的混搭。SurfaceView与多线程混搭,是为了
- 一.介绍门面模式(Facade Pattern)属于结构型模式。门面模式又叫作外观模式,通过给多个复杂的子系统提供一个门面(高层接口),使这
- 十六进制字符串与数值类型之间转换(C# 编程指南) 以下示例演示如何执行下列任务: 获取字符串中每个字符的十六进制值。 获取与十六进制字符串
- 本文实例讲述了C#中WPF使用多线程调用窗体组件的方法。分享给大家供大家参考。具体如下:Thread thread=new Thread(n
- 本文实例讲述了C#中DataSet转化为实体集合类的方法,分享给大家供大家参考。具体实现方法如下:/// <summary>//
- 各个框架版本信息springboot: 2.1.3springcloud: Greenwich.RELEASEseata: 1.0.0sha
- 本文实例为大家分享了banner轮播图无限轮播效果的具体代码,供大家参考,具体内容如下效果展示第一步(权限配置)<uses-permi
- 方式一:通过java.net.InetAddress类获取public void test1() { try { InetAdd
- 如下所示:package test.com.gjob.services; import java.util.Properties
- 其实可以理解Handler为主线程和另外的线程之间进行数据更新的东东,并且Handler在主线程中,并在Handler直接调用线程的run方
- 线程池无限制的创建线程若采用"为每个任务分配一个线程"的方式会存在一些缺陷,尤其是当需要创建大量线程时:线程生命周期的开
- 上一篇:C# 异步多线程入门到精通之Thread篇下一篇:异步多线程之入Task,待更新启动线程池线程ThreadPool 提供的 API
- menu部分xml代码<?xml version="1.0" encoding="utf-8"
- 方法1:import java.net.HttpURLConnection;import java.net.URL;import org.j