java8的stream将一个List转为按照某个字段分组的map,再按照另一个字段取max最终得到一个map

发布时间:2023-06-18 08:30

java8的stream将一个List转为按照某个字段分组的map,(Map>)
然后再按照 更新日期 字段取分组的每个list里最大的那个,Map
最终得到一个map

List ---> (Map>) ----> Map

1. Owner对象结构

import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.Date;


@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Owner implements Serializable {
    
    /**
     * 成员名称
     */
    private String name; 

    /**
     * 身份证号
     */
    private String idcard;

    /**
     * 创建时间
     */
    private Date createTime;

    /**
     * 更新时间
     */
    private Date updateTime;

}

2. 处理过程


    @Test
    void testList() throws ParseException {
        List list = new ArrayList<>();
        // 取得字符串表示的Date对象
        Date d1 = DateUtils.toDate("1662-05-04 22:22:22");
        Date d2 = DateUtils.toDate("0599-01-23 00:00:00");
        Date d3 = DateUtils.toDate("1328-10-21 11:11:11");

        Owner o1 = Owner.builder().idcard("1001").updateTime(d1).name("康熙").build();
        Owner o2 = Owner.builder().idcard("1001").updateTime(d2).name("李世民").build();
        Owner o3 = Owner.builder().idcard("1001").updateTime(d3).name("朱元璋").build();

        Owner o4 = Owner.builder().idcard("1002").updateTime(d1).name("张三").build();
        Owner o5 = Owner.builder().idcard("1003").updateTime(d1).name("李四").build();

        list.add(o1);
        list.add(o2);
        list.add(o3);
        list.add(o4);
        list.add(o5);

        // 将List按照Owner对象的 idcard 字段分组 得到map
        Map> listMap = list.stream().collect(Collectors.groupingBy(Owner::getIdcard));

        // java8 Stream max函数使用的比较器:按照updateTime字段比较
        Comparator comparator = Comparator.comparing(Owner::getUpdateTime);

        // Map转换,取得每个idcard的最后更新的对象(多取一)
        Map resultMap = new HashMap<>();
        listMap.entrySet().stream().forEach(e-> {
            Owner owner = e.getValue().stream().max(comparator).get();
            resultMap.put(e.getKey(), owner);
        });

        // 最终得到 每个idcard一个对象的map
        System.out.println(GsonUtils.toGson(resultMap));

3. 最终结果:


{
    "1003":{
        "name":"李四",
        "idcard":"1003",
        "updateTime":"1662-05-04 22:22:22"
    },
    "1002":{
        "name":"张三",
        "idcard":"1002",
        "updateTime":"1662-05-04 22:22:22"
    },
    "1001":{
        "name":"康熙",
        "idcard":"1001",
        "updateTime":"1662-05-04 22:22:22"
    }
}

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号