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)
相关推荐
世转神风-13 分钟前
qt-kits-警告:No C++ compiler,无法正常解析工程项目.pro文件
开发语言·c++
翔云 OCR API14 分钟前
承兑汇票识别接口技术解析与应用实践
开发语言·人工智能·python·计算机视觉·ocr
元周民14 分钟前
matlab求两个具有共根的多项式的所有共根(未详细验证)
开发语言·matlab
guslegend32 分钟前
Tomact高级使用及原理剖析
java
Code blocks33 分钟前
SpringBoot从0-1集成Minio对象存储
java·spring boot·后端
不忘不弃37 分钟前
十进制数转换为二进制数
开发语言
故渊ZY38 分钟前
MyBatis事务原理与实战指南
java·mybatis
HTouying1 小时前
线程池【工具类】
java
深盾科技1 小时前
融合C++与Python:兼顾开发效率与运行性能
java·c++·python
csbysj20201 小时前
jQuery Mobile 触摸事件
开发语言