有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java希望通过按属性对其他对象列表进行分组来创建一个新列表

要通过按属性对其他对象列表进行分组来创建列表吗 代码如下:

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,并且开始日期和结束日期也会更新。(开始日期最早,结束日期为最后一个)


共 (1) 个答案

  1. # 1 楼答案

    你可以使用收集器。使用mergefunction映射,合并具有相同phaseData对象的值

     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();