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)
相关推荐
懂点Tech3 小时前
ctfshow MISC入门图片篇(信息附加):misc41解题思路
开发语言·python
金銀銅鐵4 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
catchadmin4 小时前
PHP 8.7 协程新提案 让跨协程代码共享请求身份
开发语言·php
福建佰胜张工4 小时前
SMC 薄型气爪 MHF2-16D1 深度解析:平行开闭、低剖面结构在自动化装配中的选型与落地
java·服务器·安全·自动化
念何架构之路4 小时前
go-grpc设计思想
开发语言·后端·golang
catoop4 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全
system_error_x5 小时前
SpringBoot 集成 Thymeleaf 简洁入门
java·spring boot·后端
酷炫码神5 小时前
Day 10|Pinia 状态管理:把散落在各组件的数据,收进一个全局仓库
android·开发语言·javascript
驭渊的小故事5 小时前
Spring AI Alibaba 实战:从maven依赖治理到声明式工具调用
java·人工智能·spring
Elastic 中国社区官方博客6 小时前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es