相关文章推荐
追风的羽毛球  ·  .NET Conf China ...·  4 月前    · 
温暖的梨子  ·  如何获得GitHub ...·  1 年前    · 

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

执行结果:

 二、判断方法

1.anyMatch(T -> boolean)

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

2.allMatch(T -> boolean)

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

3.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);

执行结果:

Java8提供了Stream(流)处理集合的关键抽象概念,它可以对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。Stream API 借助于同样新出现的Lambda表达式,极大的提高编程效率和程序可读性。下面是使用Stream的常用方法的综合实例:创建User.class(用户信息表)import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;im... docker Warning: Stopping docker.service, but it can still be activated by: docker.socket 生活的时间简史: 可以试一下,换个网络,比如开个流量,换网已解决 如何解密Navicat存储的密码 seenoor: 成功解密,感谢! SpringBoot 整合 Swagger3.0 和 Knife4j 权颜 好好生活: 接口访问地址,好用 IntelliJ IDEA 配置MongoDB插件、连接MongoDB Fireloli7: 现在这个插件改名了:mongodb browser IntelliJ IDEA 配置MongoDB插件、连接MongoDB Fireloli7: 集群的怎么连接的自带那个database