首页 > 解决方案 > 想要通过按属性对其他对象列表进行分组来创建新列表

问题描述

想要通过按属性将其他对象列表分组来创建列表,代码是这样的:

public class MyDate {
    public static void main(String[] args) {

        List<Data> list = new ArrayList<>();
        list.add(new Data("NEW",todayDate,todayDatePlus1,"N"));
        list.add(new Data("AUTORIZED",todayDate,todayDatePlus1,"Y"));
        list.add(new Data("AUTORIZED",todayDatePlus1,todayDatePlus3,"Y"));
        list.add(new Data("AUTHENTICATE",todayDate,todayDatePlus1,"Y"));
        list.add(new Data("AUTHENTICATE",todayDatePlus1,todayDatePlus2,"Y"));
        list.add(new Data("COMPLETED",todayDate,todayDatePlus1,"N"));

    }
}

@Getter
@Setter
class Data{
    String phase;
    LocalDate startDate;
    LocalDate endDate;
    String required;
    
    Data(String phase,  LocalDate startDate, LocalDate endDate, String required) {
        this.phase = phase;
        this.startDate = startDate;
        this.endDate = endDate;
        this.required = required;
    }
}

输出:

In New List 

("NEW",todayDate,todayDatePlus1,"N")
**("AUTORIZED",todayDate,todayDatePlus3,"Y")**
**("AUTHENTICATE",todayDate,todayDatePlus2,"Y")**
("COMPLETED",todayDate,todayDatePlus1,"N")

在新列表中,重复属性阶段组合为 1,并且 StartDate 和 EndDate 也被更新。(StartDate Earlist 一个和 EndDate 作为最后一个)

标签: javalistgrouping

解决方案


您可以使用 Collectors.toMap 和mergefunction, 来合并Data具有相同对象的值phase

 Collection<Data> result = list.stream()
            .collect(Collectors.toMap(Data::getPhase, Function.identity(), ((existing, replacement) -> {

                // Merge values of replacement with existing
                existing.setEndDate(replacement.getEndDate());
                return existing;
            }))).values();

推荐阅读