Lambda表达式(3)|(List对象转map)

Lambda表达式(3)|(List对象转map)


前言

本章节主要介绍java8的新特性Lambda表达式基于List实现根据object字段对数据进行转换、或者聚合转换。

一、java8中Lambda是什么?

Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。语法形式为 () -> {},其中 () 用来描述参数列表,{} 用来描述方法体,-> 为 lambda运算符。

二、数据准备

1.创建实体

创造Object实体

  @Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class EmployeeDto {
    private String id;
    private String name;
    private String no_id;
    private String dept;
    private int year;
    private EmpInfoPo info;
}

2.初始化数据

构建List实体数据

{"dept":"研发部1","id":"001","name":"员工1号","no_id":"YF001","year":2}
{"dept":"研发部2","id":"002","name":"员工2号","no_id":"YF001","year":5}
{"dept":"研发部3","id":"003","name":"员工3号","no_id":"YF001","year":7}
{"dept":"研发部4","id":"004","name":"员工4号","no_id":"YF001","year":6}
{"dept":"研发部5","id":"005","name":"员工5号","no_id":"YF001","year":4}
{"dept":"研发部6","id":"006","name":"员工1号","no_id":"YF001","year":2}

三、list对象转map

1.常用转换方式

Collectors.toMap()函数有三个参数,第一个是key,第二个是value,第三个是key重复的时候处理方式

 /**
     * 生成map key -> id  value->name
     * @param employeeList
     */
    public static void toMapV1(List<EmployeeDto> employeeList){
        Map<String, String> collect = employeeList.stream()
                .collect(Collectors.toMap(EmployeeDto::getId, EmployeeDto::getName));

        /**
         * (e1,e2)->e1  表示遇到重复数据的时候选择旧的还是新的
         */
        Map<String, String> collect2 = employeeList.stream()
                .collect(Collectors.toMap(EmployeeDto::getId, EmployeeDto::getName,(e1,e2)->e1));

        /**
         * e -> e 表示取实体
         */
        Map<String, EmployeeDto> collect3 = employeeList.stream()
                .collect(Collectors.toMap(EmployeeDto::getId, e -> e));
    }

2.根据条件聚合成map

Collectors.partitioningBy()函数实现判断条件,根据条件分组

    /**
     * 按照year 分成两组数据 组成map
     * @param employeeList
     */
    public static void toMapV2(List<EmployeeDto> employeeList){
        Map<Boolean, List<EmployeeDto>> collect = employeeList.stream()
                .collect(Collectors.partitioningBy(e -> e.getYear() > 3));
    }

BinaryOperator实现一个比较容器,Comparator.comparingDouble表示使用比较的方法,
会根据id进行分组取score得分大的作为valu组装成map

      Map<String, DocumentParagraph> collect = paragraphs.stream()
                .collect(Collectors.toMap(DocumentParagraph::getId, p -> p,
                        BinaryOperator.maxBy(Comparator.comparingDouble(DocumentParagraph::getScore))
                ));

3.根据条件聚合成LinkedHashMap(保持原有数据顺序)

Collectors.partitioningBy()函数实现判断条件,根据条件分组,分组后原有数据顺序不变

    /**
     * 按照year 分成两组数据 组成LinkedHashMap 原有顺序不变
     * @param employeeList
     */
    LinkedHashMap<String, List<EmployeeDto>> similarContentsMap = similarContents.parallelStream().collect(
                Collectors.groupingBy(
                        EmployeeDto::getYear,
                        LinkedHashMap::new,
                        Collectors.toList()));

3.根据字段聚合成map

Collectors.groupingBy()根据字段为key分组

    /**
     * 按照name 分组生成map
     * @param employeeList
     */
    public static void toMapV3(List<EmployeeDto> employeeList){
        Map<String, List<EmployeeDto>> collect = employeeList.stream()
                .collect(Collectors.groupingBy(e -> e.getName()));
    }

总结

以上就是Java8新特性Lambda表达式实现集合List转map常用场景。后续会慢慢完善Lambda表达式的去重遍历过滤等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值