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)
相关推荐
xxie1237941 分钟前
参数Parameter,形参Formal Parameter,实参Actual Argument
开发语言·python
小短腿的代码世界4 分钟前
高性能订单路由与智能拆单算法:Qt在量化交易系统中的核心架构——毫秒级延迟下如何隐藏你的交易意图?
开发语言·qt·架构
nice_lcj5205 分钟前
排序(4)-归并排序专题——归并排序的分治美学
java·数据结构·算法·排序算法
阿正的梦工坊7 分钟前
【Rust】20-Rust 编译器架构与 MIR/LLVM 优化管线
开发语言·架构·rust
在放️8 分钟前
Python 爬虫 · XML、xpath 与 lxml 模块基础
开发语言·爬虫·python
我登哥MVP8 分钟前
SpringCloud 核心组件解析:服务调用和负载均衡
java·spring boot·后端·spring·spring cloud·java-ee·负载均衡
插件开发8 分钟前
英伟达cuda程序通用性关键 geforce 20xx代到最新版 在20xx上编译的c++程序可以通用吗?
java·c++·人工智能
我要打打代码9 分钟前
C# 扩展方法
开发语言·c#
JackSparrow41410 分钟前
彻底理解Java NIO(三)Java实现 I/O多路复用+Reactor模式及开源框架代码解读
java·c语言·开发语言·后端·nio·reactor模式
程序员黑豆10 分钟前
AI全栈开发 - Java:数据类型
java·前端