Java8使用Stream流实现List列表的遍历、统计、排序等

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

    }
}

执行结果:

  • 15
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
stream遍历list集合可以使用stream()方法将List转换为,然后使用forEach()方法对中的每个元素进行遍历操作。以下是一个示例代码: ```java List<String> userList = new ArrayList<>(); userList.add("康熙爷"); userList.add("莫愁"); userList.add("颜如玉"); userList.stream().forEach(System.out::println); ``` 上述代码中,我们首先创建了一个List集合,并使用add()方法添加了一些元素。然后,我们使用stream()方法将List转换为,并使用forEach()方法对中的每个元素进行遍历使用System.out.println()打印每个元素。 运行上述代码会输出以下结果: ``` 康熙爷 莫愁 颜如玉 ``` 这样就实现了对List集合的stream遍历。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Java8使用Stream实现List列表遍历统计排序等](https://blog.csdn.net/Amber_1/article/details/119862443)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Java8 Stream对两个 List 遍历匹配数据的优化处理操作](https://download.csdn.net/download/weixin_38628953/12720957)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值