Java8使用Stream流实现List列表简单使用

news2024/11/24 20:33:53

  

目录

1.forEach()

2.filter(T -> boolean)

3.findAny()和findFirst()

4.map(T -> R) 和flatMap(T -> stream)

5.distinct() 去重

6.limit(long n)和skip(long n) 

7.anyMatch(T -> boolean)

8.allMatch(T -> boolean)

9.noneMatch(T -> boolean)


Java8提供了Stream(流)处理集合的关键抽象概念,Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。它可以对集合进行操作,可以执行非常复杂的查找、过滤和映射数据等操作。Stream API 借助于同样新出现的Lambda表达式,极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

下面是Stream常用函数综合实例:

创建User.class(用户信息表)

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
 
import java.math.BigDecimal;
 
/**
 * 功能: 用户表
 *
 * ──────────────────────────────────────────
 *   version  变更日期    修改人    修改说明
 * ------------------------------------------
 *   V1.0.0   2021/8/20     CHY     初版
 * ──────────────────────────────────────────
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private int id;
    private String name;
    private String sex;
    private int age;
    private String dept;
    private BigDecimal salary;
}

1.forEach()

使用forEach()遍历列表数据。

public class forEachTest {
    public static void main(String[] args) {
 
        List<User> userList = new ArrayList<User>();
        userList.add(new User(1, "康熙爷", "男", 32, "总裁办", BigDecimal.valueOf(3000)));
        userList.add(new User(2, "和珅", "男", 30, "财务部", BigDecimal.valueOf(1800)));
        userList.add(new User(3, "颜如玉", "女", 20, "人事部", BigDecimal.valueOf(1700)));
        userList.add(new User(4, "纪晓岚", "男", 29, "研发部", BigDecimal.valueOf(2000)));
        userList.add(new User(5, "杜小月", "女", 23, "人事部", BigDecimal.valueOf(1500)));
 
        //1.使用 forEach() 遍历列表数据
        System.out.println("======================使用 forEach() 遍历列表数据 方法1======================");
        userList.forEach(System.out::println);
        System.out.println("======================使用 forEach() 遍历列表数据 方法2======================");
        userList.forEach(user -> System.out.println(user));
        
    }
}

 执行结果:


 2.filter(T -> boolean)

 使用filter()过滤列表数据。

【示例】获取部门为"人事部"的用户列表

public class filterTest {
    public static void main(String[] args) {
        List<User> userList = new ArrayList<User>();
        userList.add(new User(1, "康熙爷", "男", 32, "总裁办", BigDecimal.valueOf(3000)));
        userList.add(new User(2, "和珅", "男", 30, "财务部", BigDecimal.valueOf(1800)));
        userList.add(new User(3, "颜如玉", "女", 20, "人事部", BigDecimal.valueOf(1700)));
        userList.add(new User(4, "纪晓岚", "男", 29, "研发部", BigDecimal.valueOf(2000)));
        userList.add(new User(5, "杜小月", "女", 23, "人事部", BigDecimal.valueOf(1500)));
 
        /**
         * 2.filter(T -> boolean)
         * 使用 filter() 过滤列表数据。
         * 【示例】获取部门为“研发部”的用户列表
         * */
        System.out.println("======================使用 filter() 过滤列表数据======================");
        userList.stream().filter(user -> user.getDept().equals("人事部")).collect(Collectors.toList()).forEach(System.out::println);
    }
}

 执行结果:

 


3.findAny()和findFirst()

使用findAny()和findFirst()获取第一天数据。

示例】获取用户名称为"杜小月"的用户信息,如果未找到则返回null。

public class findAnytTest {
    public static void main(String[] args) {
 
        List<User> userList = new ArrayList<User>();
        userList.add(new User(1, "康熙爷", "男", 32, "总裁办", BigDecimal.valueOf(3000)));
        userList.add(new User(2, "和珅", "男", 30, "财务部", BigDecimal.valueOf(1800)));
        userList.add(new User(3, "颜如玉", "女", 20, "人事部", BigDecimal.valueOf(1700)));
        userList.add(new User(4, "纪晓岚", "男", 29, "研发部", BigDecimal.valueOf(2000)));
        userList.add(new User(5, "杜小月", "女", 23, "人事部", BigDecimal.valueOf(1500)));
 
        /**
         * 3.findAny() 和 findFirst()
         * 使用 findAny() 和 findFirst() 获取第一条数据。
         *【示例】获取用户名称为“杜小月”的用户信息,如果未找到则返回null
         *【示例】获取用户名称为“杜小月”的用户信息,如果未找到则返回null
         *
         * PS:findFirst()和findAny都是获取列表中的第一条数据,但是fandAny()操作发,返回的元素是不确定的,对于同一个列表多次调用findAny()有可能会返回不同的值。
         * 使用findAny()是为了更高效的性能。如果是数据较少,串行的情况下,一般都会返回第一个结果,如果是并行(parallelStream并行流)的情况下,那就不能确保是第一个。
         * */
        System.out.println("======================使用 findAny() 和 findFirst() 获取第一条数据 ======================");
        User user = userList.stream().filter(u -> u.getName().equals("杜小月")).findAny().orElse(null);
        System.out.println("存在杜小月的用户信息:" + user);
        User user1 = userList.stream().filter(u -> u.getName().equals("戴沾")).findFirst().orElse(null);
        System.out.println("不存在戴沾的用户信息:" + user1);
 
    }
}

 执行结果:

 


4.map(T -> R) 和flatMap(T -> stream)

使用map()将流中的每一个元素T映射为R(类似类型转换)。

使用flatMap()将流中的每一个元素T映射为一个流,再把每一个流连接成一个流。

【示例】使用map()方法获取用户列表中的名称列。

public class mapTest {
    public static void main(String[] args) {
 
        List<User> userList = new ArrayList<User>();
        userList.add(new User(1, "康熙爷", "男", 32, "总裁办", BigDecimal.valueOf(3000)));
        userList.add(new User(2, "和珅", "男", 30, "财务部", BigDecimal.valueOf(1800)));
        userList.add(new User(3, "颜如玉", "女", 20, "人事部", BigDecimal.valueOf(1700)));
        userList.add(new User(4, "纪晓岚", "男", 29, "研发部", BigDecimal.valueOf(2000)));
        userList.add(new User(5, "杜小月", "女", 23, "人事部", BigDecimal.valueOf(1500)));
        
        /**
         * 4.map(T -> R) 和 flatMap(T -> Stream)
         * 使用 map() 将流中的每一个元素 T 映射为 R(类似类型转换)。
         * 使用 flatMap() 将流中的每一个元素 T 映射为一个流,再把每一个流连接成为一个流。
         * 【示例】使用 map() 方法获取用户列表中的名称列
         * */
        System.out.println("======================使用 map() 将流中的每一个元素 T 映射为 R(类似类型转换)======================");
        List<String> nameList = userList.stream().map(User::getName).collect(Collectors.toList());
        nameList.forEach(System.out::println);
    }
}

 执行结果:

【示例】使用flatMap()将流中的每一个元素链接成为一个流。

public class flatMapTest {
    public static void main(String[] args) {
        //创建用户列表
        List<String> userList = new ArrayList<String>();
        userList.add("康熙爷、莫愁、颜如玉");
        userList.add("纪晓岚、杜小月、和珅");
 
        //分割用户列表,使用flatMap()将流中的每一个元素链接成一个流。
        userList = userList.stream()
                .map(city -> city.split("、"))
                .flatMap(Arrays::stream)
                .collect(Collectors.toList());
 
        //遍历用户列表
        userList.forEach(System.out::println);
    }
}

 执行结果:

 


5.distinct() 去重

 使用distinct()方法可以去除重复的数据。

public class distinctTest {
    public static void main(String[] args) {
 
        List<User> userList = new ArrayList<User>();
        userList.add(new User(1, "康熙爷", "男", 32, "总裁办", BigDecimal.valueOf(3000)));
        userList.add(new User(2, "和珅", "男", 30, "财务部", BigDecimal.valueOf(1800)));
        userList.add(new User(3, "颜如玉", "女", 20, "人事部", BigDecimal.valueOf(1700)));
        userList.add(new User(4, "纪晓岚", "男", 29, "研发部", BigDecimal.valueOf(2000)));
        userList.add(new User(5, "杜小月", "女", 23, "人事部", BigDecimal.valueOf(1500)));
 
        List<String> deptList = userList.stream().map(User::getDept).distinct().collect(Collectors.toList());
        deptList.forEach(System.out::println);
    }
}

 执行结果:


 6.limit(long n)和skip(long n) 

 limit(long n)方法用于返回前n条数据,skip()方法用于跳过前n条数据。

【示例】获取用户列表,要求跳过第1条数据后的前3条数据。

public class limitAndSkipTest {
    public static void main(String[] args) {
 
        List<User> userList = new ArrayList<User>();
        userList.add(new User(1, "康熙爷", "男", 32, "总裁办", BigDecimal.valueOf(3000)));
        userList.add(new User(2, "和珅", "男", 30, "财务部", BigDecimal.valueOf(1800)));
        userList.add(new User(3, "颜如玉", "女", 20, "人事部", BigDecimal.valueOf(1700)));
        userList.add(new User(4, "纪晓岚", "男", 29, "研发部", BigDecimal.valueOf(2000)));
        userList.add(new User(5, "杜小月", "女", 23, "人事部", BigDecimal.valueOf(1500)));
 
        List<User> limitAndSkipList = userList.stream().skip(1).limit(3).collect(Collectors.toList());
        limitAndSkipList.forEach(System.out::println);
 
    }
}

 执行结果:

 


7.anyMatch(T -> boolean)

使用anyMatch(T -> boolean)判断流中是否有一个元素匹配给定的T -> boolean条件。

8.allMatch(T -> boolean)

使用 allMatch(T -> boolean) 判断流中是否所有元素都匹配给定的 T -> boolean 条件。

 9.noneMatch(T -> boolean)

使用 noneMatch(T -> boolean) 流中是否没有元素匹配给定的 T -> boolean 条件。

【示例】使用 anyMatch()、allMatch()、noneMatch() 进行判断。

public class matchTest {
    public static void main(String[] args) {
 
        List<User> userList = new ArrayList<User>();
        userList.add(new User(1, "康熙爷", "男", 32, "总裁办", BigDecimal.valueOf(3000)));
        userList.add(new User(2, "和珅", "男", 30, "财务部", BigDecimal.valueOf(1800)));
        userList.add(new User(3, "颜如玉", "女", 20, "人事部", BigDecimal.valueOf(1700)));
        userList.add(new User(4, "纪晓岚", "男", 29, "研发部", BigDecimal.valueOf(2000)));
        userList.add(new User(5, "杜小月", "女", 23, "人事部", BigDecimal.valueOf(1500)));
 
        //判断用户列表中是否存在名称为“杜小月”的数据
        boolean result = userList.stream().anyMatch(user -> user.getName().equals("杜小月"));
 
        //判断用户名称是否都包含“杜小月”字段
        boolean result2 = userList.stream().allMatch(user -> user.getName().equals("杜小月"));
 
        //判断用户名称是否存在不包含“杜小月”字段
        boolean result3 = userList.stream().noneMatch(user -> user.getName().equals("杜小月"));
 
        //打印结果
        System.out.println("result=" + result);
        System.out.println("result2=" + result2);
        System.out.println("result3=" + result3);
 
    }
}

 执行结果:

 

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

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

相关文章

ASP.NET Core MVC 从入门到精通之数据库

随着技术的发展&#xff0c;ASP.NET Core MVC也推出了好长时间&#xff0c;经过不断的版本更新迭代&#xff0c;已经越来越完善&#xff0c;本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容&#xff0c;适用于初学者&#xff0c;在校毕业生&#xff0c…

ThingsBoard教程(三四):筛选规则节点 根据资产,设备,筛选,asset profile switch,device profile switch

前言 这是规则节点解析系列的第一篇,让我们先从Filter Nodes ,筛选节点类型开始。 筛选节点的作用主要是为了从筛选进入规则链的数据,根据一定的判断表达式来判断,数据向下游的那个分支流转。类似我们编程中的switch语句或if语句。 本篇主要讲解asset profile switch 与de…

每天一道算法练习题--Day13 第一章 --算法专题 --- ----------动态规划(重置版)

动态规划是一个从其他行业借鉴过来的词语。 它的大概意思先将一件事情分成若干阶段&#xff0c;然后通过阶段之间的转移达到目标。由于转移的方向通常是多个&#xff0c;因此这个时候就需要决策选择具体哪一个转移方向。 动态规划所要解决的事情通常是完成一个具体的目标&…

什么是渲染农场?我什么时候应该使用渲染农场?

网络上有关渲染农场的概念数不胜数&#xff0c;有一部分说法甚至让我们对渲染农场有了很大误解&#xff0c;究竟真正什么是渲染农场、渲染农场有多少种类型&#xff1f;我们怎么选择适合自己的渲染农场&#xff1f;这些都是各位小伙伴们近期比较关心的一些问题。 首先渲染农场是…

【C语言】基础语法7:文件操作

上一篇&#xff1a;字符串和字符处理 ❤️‍&#x1f525;前情提要❤️‍&#x1f525;   欢迎来到C语言基本语法教程   在本专栏结束后会将所有内容整理成思维导图&#xff08;结束换链接&#xff09;并免费提供给大家学习&#xff0c;希望大家纠错指正。本专栏将以基础出…

域内密码凭证获取

Volume Shadow Copy 活动目录数据库 ntds.dit&#xff1a;活动目录数据库&#xff0c;包括有关域用户、组和成员身份的 信息。它还包括域中所有用户的哈希值。 ntds.dit文件位置&#xff1a;%SystemRoot%\NTDS\NTDS.dit system文件位置&#xff1a;%SystemRoot%\System32\c…

好程序员:前端JavaScript全解析——Canvas绘制形状(下)

接着上一篇&#xff0c;好程序员继续讲解前端技术文章&#xff01; 绘制椭圆 ●canvas 也提供了绘制椭圆的 API ●语法 : 工具箱.ellipse( x, y, radiusX, radiusY, rotation, startAngle, endAngle, antiClockwise ) ○x : 椭圆中心点的 x 轴坐标 ○y : 椭圆中心点的 y 轴坐标…

Maven详解

一、什么是Maven Maven 是⼀个项⽬构建⼯具&#xff0c;创建的项⽬只要遵循 Maven 规范&#xff08;称为Maven项目&#xff09;&#xff0c;即可使用Maven 来进行&#xff1a;管理 jar 包、编译项目&#xff0c;打包项目等功能。 为什么学习 Servlet 之前要学 Maven&#xff1…

SAM(2023)-分割万物

文章目录 摘要算法数据引擎实验7.1 零样本单点生成mask7.2 零样本边缘检测7.3. 零样本目标Proposals7.4. 零样本实例分割7.5. 零样本文本生成Mask7.6. 消融实验 讨论限制&#xff1a;结论&#xff1a; 论文: 《Segment Anything》 github: https://github.com/facebookresear…

java获取类结构信息

package com.hspedu.reflection;import org.junit.jupiter.api.Test;import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method;/*** author 韩顺平* version 1.0* 演示如何通过反射获…

初级算法-回溯算法

主要记录算法和数据结构学习笔记&#xff0c;新的一年更上一层楼&#xff01; 初级算法-回溯算法 一、组合二、电话号码的字母组合三、组合总和四、组合Ⅱ五、组合Ⅲ六、分割回文串七、复原IP地址八、子集问题九、子集Ⅱ十、递增子序列十一、重新安排行程十二、全排列十三、全…

CASAIM自动化精密尺寸测量设备全尺寸检测铸件自动化检测铸件

铸造作为现代装备制造工业的基础共性技术之一&#xff0c;铸件产品既是工业制造产品&#xff0c;也是大型机械的重要组成部分&#xff0c;被广泛运用在航空航天、工业船舶、机械电子和交通运输等行业。 铸件形状复杂&#xff0c;一般的三坐标或者卡尺圆规等工具难以获取多特征…

【基础算法】八大排序算法:直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序(快排),归并排序,计数排序

文章目录 ✔️前言直接插入排序希尔排序选择排序1. 选择排序基础2. 选择排序优化3. 复杂度的分析 堆排序【⭐重点掌握⭐】1. 对堆的认识和数组建堆2. 对数组进行堆排序操作3. 复杂度的分析 冒泡排序快速排序【⭐重点掌握⭐】1. 霍尔法2. 挖坑法3. 前后指针法4. 快速排序优化&am…

每日一个小技巧:1招教你提取伴奏怎么做

伴奏是指在演唱或演奏时&#xff0c;用来衬托或补充主唱或乐器的音乐声音。而伴奏提取是一种技术&#xff0c;它可以帮助我们从歌曲中将人声和乐器分离出来。当我们听到一些喜欢的歌曲时&#xff0c;往往会被它的旋律深深吸引&#xff0c;想要将其作为自己的演唱曲目&#xff0…

国考只考一门?免试入学还好毕业的在职研究生专业有哪些

读同等学力申硕的同学想要拿学位证&#xff0c;那么首先要过的坎就是国考。修满学分和通过校考一般都不会很难&#xff0c;只要按时上课、根据院校安排的课程复习即可。而国考是全国统一命题、考试&#xff0c;大部分专业要考2门&#xff0c;对于有的同学来说&#xff0c;备考压…

从零开始学Python第13课:常用数据结构之字典

迄今为止&#xff0c;我们已经为大家介绍了Python中的三种容器型数据类型&#xff0c;但是这些数据类型仍然不足以帮助我们解决所有的问题。例如&#xff0c;我们需要一个变量来保存一个人的信息&#xff0c;其中包含了这个人的姓名、年龄、身高、体重、家庭住址、本人手机号、…

Springboot 自定义缓存配置 CacheManager 及redis集成

目录 前言 集成 maven依赖 CacheManagerConfig配置 redis配置 使用 Springboot 集成使用缓存 Cacheable CacheEvict 前言 现有项目中经常遇到的缓存集成问题&#xff0c;Springboot提供了统一的接口抽象与缓存管理器&#xff0c;可集成多种缓存类型&#xff0c;如 Co…

Java阶段二Day10

Java阶段二Day10 文章目录 Java阶段二Day10DQLGROUP BY 分组按单字段分组例 按多字段分组例 按照聚合函数的结果排序例 HAVING子句问题错误原因HAVING子句的应用HAVING和WHERE的区别例 子查询 (SubQuery)概念应用场景子查询分类在DQL中使用子查询单行单列子查询例 多行单列子查…

hook函数

什么是hook函数 在计算机编程中&#xff0c;hook函数是指在特定的事件发生时被调用的函数&#xff0c;用于在事件发生前或后进行一些特定的操作。通常&#xff0c;hook函数作为回调函数被注册到事件处理器中&#xff0c;当事件发生时&#xff0c;事件处理器会自动调用相应的ho…

QtDAY 2

代码&#xff1a; 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> #include <QString> #include <QTextToSpeech>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : …