0

我希望数据库记录列表是 groupby 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

我只需要首先返回按最少项目日期排序的最高记录。不需要相同订单 ID 的第二条记录。

POJO

public class ItemDetail {

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

    //setter/getters
}

DAO层会返回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;
}

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

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 分组,按项目日期排序,只返回最少日期记录。不要删除相同订单编号的唯一商品编号记录。如何在 Java 8 中做到这一点?

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

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

所以只有我想将密钥保留为 orderId-itemNumber

4

1 回答 1

4

首先,考虑使用LocalDate. Date非常过时。

private LocalDate itemDate;

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

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

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;
}
于 2021-08-06T08:23:50.500 回答