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
首先,考虑使用LocalDate
。 Date
已经过时了。
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;
}
我希望数据库记录列表按 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
首先,考虑使用LocalDate
。 Date
已经过时了。
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;
}