java 8 lambda表达式对list进行分组

java8的lambda表达式提供了一些方便list操作的方法,主要涵盖分组、过滤、求和、最值、排序、去重。跟之前的传统写法对比,能少写不少代码。
分组函数groupingBy()

分组函数示例:

java 复制代码
 Map<String, List<Workers>> groupBySex = 
 WorkersList.stream()
 .filter(v->v.getName()!=null)
 .collect(Collectors.groupingBy(Workers::getName));

从WorkersList中筛选出name不为空的数据,再对这些数据按照name进行分组,分组结果是一个map。

1.创建实体类

java 复制代码
import java.math.BigDecimal;
import java.util.Date;
public class Workers {

    private Long id;

    //姓名
    private String name;

    //年龄
    private int age;

    //工号
    private String jobNumber;

    //性别
    private String sex;

    //入职日期
    private Date entryDate;

    //家庭成员数量
    private BigDecimal familyMemberQuantity;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getJobNumber() {
        return jobNumber;
    }

    public void setJobNumber(String jobNumber) {
        this.jobNumber = jobNumber;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Date getEntryDate() {
        return entryDate;
    }

    public void setEntryDate(Date entryDate) {
        this.entryDate = entryDate;
    }

    public BigDecimal getFamilyMemberQuantity() {
        return familyMemberQuantity;
    }

    public void setFamilyMemberQuantity(BigDecimal familyMemberQuantity) {
        this.familyMemberQuantity = familyMemberQuantity;
    }
}

2.分组

通过groupingBy可以分组指定字段

java 复制代码
public class Application {

    public static void main(String[] args) {
        List<Workers> WorkersList = new ArrayList<>();
        Workers workers = new Workers();
        workers.setAge(23);
        workers.setName("jimmy");
        workers.setJobNumber("mk");
        Workers worker = new Workers();
        worker.setAge(19);
        worker.setName("gigi");
        worker.setJobNumber("mimi");
        WorkersList.add(workers);
//分组
        Map<String, List<Workers>> groupBySex = WorkersList.stream().filter(v->v.getName()!=null).collect(Collectors.groupingBy(Workers::getName));
        //遍历分组
        for (Map.Entry<String, List<Workers>> entryWorkers : groupBySex.entrySet()) {
            String key = entryWorkers.getKey();
            List<Workers> entryWorkersList = entryWorkers.getValue();
            System.out.println(entryWorkersList);
        }
    }
}

注意:

(1)上面的分组存在key空值安全问题,需要做过滤或封装处理,这里用到的过滤方法是:

java 复制代码
filter(v->v.getName()!=null)
相关推荐
paeamecium6 分钟前
【PAT甲级真题】- Student List for Course (25)
数据结构·c++·算法·list·pat考试
希望永不加班30 分钟前
SpringBoot 过滤器(Filter)与请求链路梳理
java·spring boot·后端·spring
Lyyaoo.33 分钟前
【JAVA基础面经】抽象类/方法与接口
java·开发语言
0xDevNull37 分钟前
Java实现Redis延迟队列:从原理到高可用架构
java·开发语言·后端
糖炒栗子032638 分钟前
Go 语言环境搭建与版本管理指南 (2026)
开发语言·后端·golang
于先生吖41 分钟前
无人共享健身房 Java 后端源码 + 多端对接完整方案
java·开发语言
恼书:-(空寄1 小时前
Spring 事务失效的 8 大场景 + 原因 + 解决方案
java·后端·spring
cpp_learners1 小时前
银河麒麟V10+飞腾FT-2000/4处理器+QT源码静态编译5.14.2指南
开发语言·qt
野生技术架构师1 小时前
1000道互联网大厂Java岗面试原题解析(八股原理+场景题)
java·开发语言·面试
jiankeljx2 小时前
Java实战:Spring Boot application.yml配置文件详解
java·网络·spring boot