【发布时间】:2021-10-11 03:28:57
【问题描述】:
我希望数据库记录列表按 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 不是唯一的。所以删除最高日期的第二条记录。需要保留唯一记录并按 itemdate 删除重复项。
1 12345 3/10/21
1 12345 3/11/21
1 23456 3/11/21
所以只有我想将密钥保留为 orderId-itemNumber
【问题讨论】:
-
你当前的代码怎么不工作?
-
我收到此错误,类型不匹配:无法从 Map
-
不要将日期作为字符串放入 POJO。保留
LocalDate对象。 -
那只是 Date 对象。我会更新POJO
-
清道夫的回答是正确的。你的代码中的问题是第一次分组后的结果类型是 Map
所以 values() 得到 List - >.
标签: java sorting java-8 groupingby