JDK Stream流式API使用总结

news2024/9/20 17:00:59

f496fccf10c82c9ef4ed1a372f1a388f.png

前言

 JDKJava Development Kit英文首字母大写缩写,是 Sun 公司(已被 Oracle 收购)针对 Java 开发员的软件开发工具包。自从 Java 推出以来,JDK 已经成为使用最广泛的 Java SDK。从JDK8版本开始新增了Stream流式API的功能,该功能特性最大的优势就是能够大大降低代码量和提高可读性。

jdk stream filter的使用

filter是stream api用的最多的功能,它主要作用是可以根据多个条件过滤集合元素数据,下面看个示例:

1、先定义一个测试用的POJO类:

// 定义一个测试用的POJO
@Data
public class Student {
    private String name;
    private int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

2、测试filter代码:

public class StreamDemo {


    public static void main(String[] args) {
        //测试filter
        testFilter();
    }


    private static void testFilter(){
        List<Student> studentList = new ArrayList<>();
        Student zhangsan = new Student("zhangsan", 20);
        Student lisi = new Student("lisi", 25);
        Student wangwu = new Student("wangwu", 40);
        studentList.add(zhangsan);
        studentList.add(lisi);
        studentList.add(wangwu);
        // 过滤后的集合
        List<Student> filterAgeStudentList = studentList.stream()
        // 过滤年龄小于30岁的
        .filter(student -> student.getAge() < 30)
        // 过滤年龄大于于20岁的
        .filter(student -> student.getAge() > 20)
        // 保存到新的集合
        .collect(Collectors.toList());
        System.out.println(filterAgeStudentList);
    }
}

3、控制台输出截图:

466f43611864740d4c6320562281462f.png

jdk stream toMap的使用

1、toMap主要作用是将集合内元素按某个属性转换为Map,示例代码如下:

public class StreamDemo {


    public static void main(String[] args) {
        testToMap();
    }


    private static void testToMap() {
        List<Student> studentList = new ArrayList<>();
        Student zhangsan = new Student("zhangsan", 20);
        Student lisi = new Student("lisi", 25);
        Student wangwu = new Student("wangwu", 40);
        Student wangwu2 = new Student("wangwu", 50);
        studentList.add(zhangsan);
        studentList.add(lisi);
        studentList.add(wangwu);
        studentList.add(wangwu2);


        Map<String, Student> nameMap = studentList.stream()
                // 1、Collectors.toMap(第一个参数表示key, 第二个参数表示val(固定写法), 第三个参数表示重复key的处理策略(可覆盖,可丢弃))
                // 2、第三个参数可以不写,如果不写第三个策略参数,如果集合元素中存在重复的key,会报错java.lang.IllegalStateException: Duplicate key
                // 3、覆盖策略决定数据去留,如果选择oldKey表示保留先处理的元素,新进来的丢弃,选择newKey则反之
                .collect(Collectors.toMap(Student::getName, Function.identity(), (oldKey, newKey) -> oldKey));


        System.out.println(nameMap);
    }
}

2、控制台输出截图:

1bcecc4695a2df59b75c7ddaf3b74105.png

3、toMap使用注意事项:

1、Collectors.toMap(第一个参数表示key, 第二个参数表示val(固定写法), 第三个参数表示重复key的处理策略(可覆盖,可丢弃));

2、第三个参数可以不写,如果不写第三个策略参数,如果集合元素中存在重复的key,会报错java.lang.IllegalStateException: Duplicate key,建议第三个参数要写;

3、覆盖策略决定数据去留,如果选择oldKey表示保留先处理的元素,新进来的丢弃,选择newKey则反之;

jdk stream groupBy的使用

1、groupBy的主要作用是将集合内元素按照某个属性相同的值进行分组,类似sql的group by语句,示例代码如下:

public class StreamDemo {


    public static void main(String[] args) {
        testGroupBy();
    }
    private static void testGroupBy() {
        List<Student> studentList = new ArrayList<>();
        Student zhangsan = new Student("zhangsan", 20);
        Student lisi = new Student("lisi", 25);
        Student wangwu = new Student("wangwu", 40);
        Student wangwu2 = new Student("wangwu", 50);
        studentList.add(zhangsan);
        studentList.add(lisi);
        studentList.add(wangwu);
        studentList.add(wangwu2);


        Map<String, List<Student>> nameMap = studentList.stream()
                // 按名称相同的分组
                .collect(Collectors.groupingBy(Student::getName));


        System.out.println(nameMap);
    }
}

2、控制台输出截图:

7576541d649b1aea2dddd0bebb58be3f.png

3、注意返回类型是Map<key, List>结构,可以看到两个名称为wangwu的分组到了一个集合中。

jdk stream map和distinct去重的使用

1、map主要作用是从集合对象元素提取对象某个属性,distinct主要作用是对集合元素进行去重,通过map和distinct是搭配使用的,所以放到一块演示,示例代码如下:

public class StreamDemo {


    public static void main(String[] args) {
        testMap();
    }


    private static void testMap() {
        List<Student> studentList = new ArrayList<>();
        Student zhangsan = new Student("zhangsan", 20);
        Student lisi = new Student("lisi", 25);
        Student wangwu = new Student("wangwu", 40);
        Student wangwu2 = new Student("wangwu", 50);
        studentList.add(zhangsan);
        studentList.add(lisi);
        studentList.add(wangwu);
        studentList.add(wangwu2);


        List<String> nameList = studentList.stream()
                //提取名称
                .map(Student::getName)
                //可以加上去重的支持
                .distinct()
                .collect(Collectors.toList());


        System.out.println(nameList);
    }
}

2、控制台输出截图如下:

8846a96d3f3746b91e794be5b3c8a8b9.png

3、可以看到wangwu被成功去重,只保留一个。

jdk stream flatmap的使用

1、flatmap主要作用是将集合元素拉平,例如将List<List>嵌套的二维集合拉平为List一维集合,主要作用是拉平降维,代码示例如下:

public class StreamDemo {


    public static void main(String[] args) {
        testFlatMap();
    }


    private static void testFlatMap() {
        Map<String, List<Student>> studentMap = new HashMap<>();
        Student zhangsan1 = new Student("zhangsan", 20);
        Student zhangsan2 = new Student("zhangsan", 21);
        Student lisi1 = new Student("lisi", 20);
        Student lisi2 = new Student("lisi", 21);
        Student wangwu1 = new Student("wangwu", 20);
        Student wangwu2 = new Student("wangwu", 21);
        //
        List<Student> lisiList = new ArrayList<>();
        List<Student> wangwuList = new ArrayList<>();
        List<Student> zhangsanList = new ArrayList<>();
        //添加到list
        lisiList.add(lisi1);
        lisiList.add(lisi2);
        wangwuList.add(wangwu1);
        wangwuList.add(wangwu2);
        zhangsanList.add(zhangsan1);
        zhangsanList.add(zhangsan2);
        //添加到map
        studentMap.put("zhangsan", zhangsanList);
        studentMap.put("lisi", lisiList);
        studentMap.put("wangwu", wangwuList);


        //二维数组
        Collection<List<Student>> values = studentMap.values();


        //将二维集合转为一维,通过flatMap进行拉平
        List<Student> studentList = values.stream().flatMap(Collection::stream).collect(Collectors.toList());


        System.out.println(studentList);
    }
}

2、控制台输出截图如下:

48ae4caf4df83d3e8a023541343a593b.png

3、很多人会问flatmap跟map的区别,实际上flatmap跟map作用完全不一样,没什么可比较的,如果一定要说个区别那就是:map输入集合和输出集合元素数量是相同的,map不会改变元素数量,flatmap可以改变输入和输出的元素数量;

jdk stream max/min/count/sum等聚合函数的使用

1、聚合函数主要作用就是对某些维度进行统计,代码示例如下:

public class StreamDemo {


    public static void main(String[] args) {
        testAggregation();
    }


    private static void testAggregation() {
        List<Student> studentList = new ArrayList<>();
        Student zhangsan = new Student("zhangsan", 20);
        Student lisi = new Student("lisi", 25);
        Student wangwu = new Student("wangwu", 40);
        Student wangwu2 = new Student("wangwu", 50);
        studentList.add(zhangsan);
        studentList.add(lisi);
        studentList.add(wangwu);
        studentList.add(wangwu2);


        //统计年龄总和
        int totalAge = studentList.stream().mapToInt(Student::getAge).sum();
        //统计名称为wangwu的人数
        long wangwuCount = studentList.stream().filter(ele -> "wangwu".equals(ele.getName())).count();
        //统计年龄最大的学生
        Student ageMaxStudent = studentList.stream().max(Comparator.comparingInt(Student::getAge)).get();
        //统计年龄最小的学生
        Student ageMinStudent = studentList.stream().min(Comparator.comparingInt(Student::getAge)).get();
        //按名称统计不同名称数量
        Map<String, Long> groupByName = studentList.stream().collect(Collectors.groupingBy(Student::getName, Collectors.counting()));


        System.out.println(String.format("totalAge=%s, wangwuCount=%s, ageMaxStudent=%s, ageMinStudent=%s, groupByName=%s",
                totalAge, wangwuCount, ageMaxStudent.getAge(), ageMinStudent.getAge(), groupByName));
    }


}

2、控制台输出截图如下:

c733af2dfbd8779443fb6779a919e023.png

jdk stream allMatch、anyMatch的使用

1、allMatch、anyMatch主要作用是对集合元素进行整体条件判断,是否全部满足条件、或任意一个满足条件,这两个API也是很常用的,示例代码如下:

public class StreamDemo {


    public static void main(String[] args) {
        testMatch();
    }


    private static void testMatch() {
        List<Student> studentList = new ArrayList<>();
        Student zhangsan = new Student("zhangsan", 20);
        Student lisi = new Student("lisi", 25);
        Student wangwu = new Student("wangwu", 40);
        Student wangwu2 = new Student("wangwu", 50);
        studentList.add(zhangsan);
        studentList.add(lisi);
        studentList.add(wangwu);
        studentList.add(wangwu2);


        //校验集合每个元素都匹配
        boolean allMatch = studentList.stream().allMatch(ele -> "zhangsan".equals(ele.getName()));
        //校验集合任意1个元素匹配
        boolean anyMatch = studentList.stream().anyMatch(ele -> "zhangsan".equals(ele.getName()));


        System.out.println(String.format("allMatch=%s, anyMatch=%s", allMatch, anyMatch));
    }
}

2、控制台输出截图如下:

6e428c28be226b1cec216e02586aed47.png

jdk stream concat的使用

1、concat作用主要是将两个集合合并后进行一次性流式处理,示例代码如下:

public class StreamDemo {


    public static void main(String[] args) {
        testConcat();
    }


    private static void testConcat() {


        //集合1
        List<Student> studentList1 = new ArrayList<>();
        Student zhangsan = new Student("zhangsan", 20);
        Student lisi = new Student("lisi", 25);
        Student wangwu = new Student("wangwu", 40);
        Student wangwu2 = new Student("wangwu", 50);
        studentList1.add(zhangsan);
        studentList1.add(lisi);


        //集合2
        List<Student> studentList2 = new ArrayList<>();
        studentList2.add(wangwu);
        studentList2.add(wangwu2);


        //两个集合的流
        Stream<Student> stream1 = studentList1.stream();
        Stream<Student> stream2 = studentList2.stream();


        //将两个集合流合并一起
        Stream<Student> concatStream = Stream.concat(stream1, stream2);


        //合并后遍历
        concatStream.forEach(System.out::println);
    }
}

2、控制台输出截图如下:

b11c1dd6644d1aa12335d84f6a367f5b.png

---------- 正文结束 ----------
长按扫码关注微信公众号

Java软件编程之家

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/99693.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单片机毕业设计题目选题推荐

文章目录1前言2 如何选题2.1 不要给自己挖坑2.2 难度把控2.3 如何命名题目3 单片机 嵌入式 选题大全3.1 嵌入式方向3.2 算法方向3.3 移动通信方向3.4 学长作品展示4 最后1前言 &#x1f947; 近期不少学弟学妹询问学长关于单片机和嵌入式相关的毕设选题&#xff0c;学长特意写…

城镇居民医疗网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 模块划分&#xff1a;通知类型&#xff0c;通知信息&#xff0c;区域信息&#xff0c;人员信息&#xff0c;缴费类型&a…

Java基础:使用 Optional 优雅地解决判空问题

我是 ABin-阿斌&#xff1a;写一生代码&#xff0c;创一世佳话&#xff0c;筑一览芳华。如果小伙伴们觉得不错就一键三连吧~ 声明&#xff1a;原作者&#xff1a;樊亦凡&#xff1a;juejin.cn/post/6844904154075234318 文章目录1 . 前言2 . 认识 Optional 并使用2.1 Optional …

非零基础自学Golang 第9章 结构体 9.6 结构体内嵌

非零基础自学Golang 文章目录非零基础自学Golang第9章 结构体9.6 结构体内嵌9.6.1 初始化结构体内嵌9.6.2 内嵌匿名结构体第9章 结构体 9.6 结构体内嵌 Go语言的结构体内嵌是一种组合特性&#xff0c;使用结构体内嵌可构建一种面向对象编程思想中的继承关系。 结构体实例化后…

[附源码]Python计算机毕业设计Django文曦家教预约系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

PCB四层板、六层板层叠推荐设计,常见层叠方案优缺点

笔者电子信息专业硕士毕业&#xff0c;获得过多次电子设计大赛、大学生智能车、数学建模国奖&#xff0c;现就职于南京某半导体芯片公司&#xff0c;从事硬件研发&#xff0c;电路设计研究。对于学电子的小伙伴&#xff0c;深知入门的不易&#xff0c;特开次博客交流分享经验&a…

Qt-Web混合开发-WebSocket客户端程序Web版本(9)

Qt-Web混合开发-WebSocket客户端程序Web版本&#x1f49a;&#x1f49c;&#x1f251;&#x1f351; 文章目录Qt-Web混合开发-WebSocket客户端程序Web版本&#x1f49a;&#x1f49c;&#x1f251;&#x1f351;1、概述&#x1f41b;&#x1f986;2、实现效果&#x1f605;&…

Java实战:hutool-db实现多数据源配置

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

5G NR同频多beam检测方法

【摘 要】5G NR与LTE有诸多方面的不同,较突出的变化就是SSB内PSS序列和SSS序列设计与LTE明显不同,而且在每个SSB突发内会有多个SSB,多个SSB的出现增加了小区搜索的难度。由于频谱资源匮乏,所以采用同频方式组网,但因此相邻小区之间也会产生干扰,影响检测效率。同频检测技…

器乐文化网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 1.用户模块 1)登录/注册 (通过前后端交互实现用户信息注册登 录) 2&#xff09; 在线支付充值虚拟币&#xff1b;&#…

Ajax(七)+axios+跨域+JSONP

目录 1. XMLHttpRequest Level2的新特性——FormData对象管理表单数据&#xff08;一&#xff09; 用法&#xff08;二&#xff09; 2. XMLHttpRequest Level2的新特性—— 上传文件 3. XMLHttpRequest Level2的新特性—— 显示文件上传进度 4. jQuery高级用法 4.1 jQuery…

【AIOT】Python语音处理

语音信号有三个重要的参数&#xff1a;声道数、取样频率和量化位数。 声道数&#xff1a;可以是单声道或者是双声道采样频率&#xff1a;一秒内对声音信号的采集次数&#xff0c;44100Hz采样频率意味着每秒钟信号被分解成44100份。换句话说&#xff0c;每隔144100秒就会存储一次…

[附源码]计算机毕业设计Python本地助农产品销售系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

class80(CL80)双模蓝牙5.2热插拔PCB

键盘使用说明索引&#xff08;均为出厂默认值&#xff09;软件支持一些常见问题解答&#xff08;FAQ&#xff09;首次使用测试步骤蓝牙配对规则&#xff08;重要&#xff09;蓝牙和USB切换键盘默认层默认触发层0的FN键配置的功能默认功能层1配置的功能默认的快捷键蓝牙参数蓝牙…

【lssvm回归预测】基于鸽群算法优化最小二乘支持向量机PIO-lssvm实现数据回归预测附matlab代码

​✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法…

Python+Qt抽奖点名工具源码窗体程序

程序示例精选 PythonQt抽奖点名工具源码窗体程序 如需安装运行环境或远程调试&#xff0c;见文章底部微信名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonQt抽奖点名工具源码窗体程序》编写代码&#xff0c;功能包括了抽奖点名&#xff0c;历史…

【DBN分类】基于粒子群算法优化深度置信网络PSO-DBN实现数据分类附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

Enhancing Adversarial Training with Second-Order Statistics of Weights

利用二阶权重统计增强对抗训练 对抗训练已被证明是提高深度神经网络鲁棒性的最有效方法之一。它被形式化为对模型权重和对抗性扰动的最小-最大优化&#xff0c;其中权重可以通过梯度下降方法&#xff08;如SGD&#xff09;进行优化。在本文中&#xff0c;我们证明了将模型权重…

黑*头条_第2章_app端文章查看,静态化freemarker,分布式文件系统minIO(新版)

黑*头条_第2章_app端文章查看&#xff0c;静态化freemarker,分布式文件系统minIO&#xff08;新版&#xff09; 文章目录黑*头条_第2章_app端文章查看&#xff0c;静态化freemarker,分布式文件系统minIO&#xff08;新版&#xff09;1)文章列表加载1.1)需求分析1.2)表结构分析1…

2000-2020年全国31省城镇化率

2000-2020年全国31省城镇化率 1、时间&#xff1a;2000-2020年 2、范围&#xff1a;包括全国31个省 3、指标包括&#xff1a;总人口、城镇人口、农村人口、城镇化率 其中&#xff1a;城镇化率城镇人口/总人口 3、来源&#xff1a;整理自计NJ及各省统计NJ 4、指标解释&…