Java 8 Map按orderid分组,按itemLeastDate排序

Java 8 Map group by orderid and sort by itemLeastDate

我希望数据库记录列表按 orderId 分组并按 itemDate 排序。

我正在以任何顺序从数据库中获取记录。相同OrderId的记录顺序不同

OrderId Item Number Item Date
1       12345       3/10/21
2       67890       4/10/21
1       12345       3/11/21  -> duplicate. so take least date of Item 12345
1       23456       3/11/21  -> don't remove this one as itemnumb is unique
3       33441       5/10/21
2       67890       4/11/21  -> duplicate. so take least date 4/10/21 record
2       12333       4/11/21
3       33441       5/11/21  -> duplicate. so take least date 5/10/21 record
3       45321       5/11/21

我需要 return 只需要先按最少项目日期排序的顶部记录。不需要相同订单 ID 的第二条记录。

POJO

public class ItemDetail {

    private String orderId;
    private String itemNumber;
    private Date itemDate;

    //setter/getters
}

DAO 层将 return itemDetails 列表,即 List itemDetails;

从 itemDetails 列表中,我必须像下面的代码一样在地图中设置键和值,

我需要将键存储为字符串中的 OrderId-ItemNumber 组合,将值存储为 ItemDetail 对象

public List<ItemDetail> getItemDetails(List<ItemDetail> itemDetails) {
 Map<String, ItemDetail> itemMap = itemDetails.stream()
        .collect(Collectors.groupingBy(itemDetail -> itemDetail.getOrderId()))
        .values()
        .stream()
        .collect(Collectors.toMap(itemDetail -> itemDetail.getOrderId() +"-"+ itemDetail.getItemNumber(), 
                 itemDetail -> itemDetail));
return mapValueAsItemDetailList;
}

最后地图应该return只记录这样的

OrderId Item Number Item Date
1       12345       3/10/21
1       23456       3/11/21
2       67890       4/10/21
2       12333       4/11/21
3       33441       5/10/21
3       45321       5/11/21

简单来说,我需要按 orderId-itemNumber 分组并按项目日期排序,return 只需要最少的日期记录。不要删除相同订单ID的唯一商品编号记录。如何在 Java 8 中做到这一点?

记录一张。 12345 不是唯一的。所以删除最高日期的第二条记录。需要保留唯一记录并按项目日期删除重复记录。

1       12345       3/10/21
1       12345       3/11/21
1       23456       3/11/21

所以只有我想把key保留为orderId-itemNumber

首先,考虑使用LocalDateDate 已经过时了。

private LocalDate itemDate;

要删除具有相同订单 ID 的最旧商品详细信息,您可以先使用 toMap 收集器制作地图:1. 使用订单 ID + 商品编号作为键 2.项目详细信息本身作为价值。 3. 指定当有重复key时,选择日期较早的item detail作为value。

之后,获取地图的值,并从中创建一个列表。然后按日期排序列表。

public List<ItemDetail> getItemDetails(List<ItemDetail> itemDetails) {
    ArrayList<ItemDetail> list = new ArrayList<>(itemDetails.stream().collect(
        Collectors.toMap(
            x -> x.getOrderId() + x.getItemNumber(), // 1
            Function.identity(), // 2
            BinaryOperator.minBy( // 3
                Comparator.comparing(ItemDetail::getItemDate)
            )
        )
    ).values());
    list.sort(Comparator.comparing(ItemDetail::getItemDate));
    return list;
}