Java基础之Stream流(JDK1.8新特性)

简介: JDK1.8 中增加了Stream流,Stream流是一个来自数据源的元素队列并支持聚合操作。元素是特定类型的对象,形成一个队列,Java中的Stream并不会存储元素,而是按需计算数据源是流的来源,可以使集合,数组,I/O channel,生成器generator等。聚合操作类似SQL语句一样的操作,比如filter,map,reduce,match,sorted等

定义

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()));

完整的代码是:

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的运行结果

e01d1755a4ee782e80cedf947c163fba_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ1MzQ4MDg=,size_16,color_FFFFFF,t_70.jpg

总结

本文首先介绍了JDK1.8中的Stream流,Stream流是是一个来自数据源的元素队列并支持聚合操作。它的特点就是中间过程不会存储数据,不会改变数据源本身。接着介绍了stream的使用示例,stream流的使用一般是要结合函数式接口使用的。

参考

Java 8 Stream


相关文章
|
10天前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
171 100
|
10天前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
167 101
|
10天前
|
并行计算 Java 大数据
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
167 101
Java API 开发者
41 0
|
20天前
|
存储 数据可视化 Java
Java Stream API 的强大功能
Java Stream API 是 Java 8 引入的重要特性,它改变了集合数据的处理方式。通过声明式语法,开发者可以更简洁地进行过滤、映射、聚合等操作。Stream API 支持惰性求值和并行处理,提升了代码效率和可读性,是现代 Java 开发不可或缺的工具。
Java Stream API 的强大功能
|
2月前
|
存储 NoSQL Java
Java Stream API:集合操作与并行处理
Stream API 是 Java 8 提供的集合处理工具,通过声明式编程简化数据操作。它支持链式调用、延迟执行和并行处理,能够高效实现过滤、转换、聚合等操作,提升代码可读性和性能。
|
2月前
|
存储 Java API
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
319 188
|
2月前
|
存储 Java API
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
229 92
|
2月前
|
安全 Oracle Java
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
194 0
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
|
3月前
|
Oracle Java 关系型数据库
新手必看:Java 开发环境搭建之 JDK 与 Maven
本文分享了 Java 学习中 JDK 安装配置与 Maven 使用的入门知识,涵盖 JDK 下载安装、环境变量设置、Maven 安装配置及本地仓库与镜像设置,帮助新手快速搭建 Java 开发环境。
219 0

热门文章

最新文章