Java 8按orderid映射组,按itemLeadDate排序



我希望DB记录列表按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;

从项目详细信息列表,我必须设置密钥,值在地图中,如下面的代码,

我需要将关键字存储为字符串中的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分组,按项目日期排序,只返回最短日期的记录。不要删除相同订单id的唯一项目编号记录。如何在Java 8中做到这一点?

拿一张唱片。12345不是唯一的。因此删除最高日期的第二条记录。需要保留唯一的记录,并按项目日期删除重复的记录。

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

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

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

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;
}

最新更新