我希望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
首先,考虑使用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;
}