我有Java bean像
class OrderDeatils {
Long orderId;
Long userId;
OrderInfo info;
\Required getter/setter
}
class OrderInfo {
OffsetDateTime orderCreatedDate;
\Required getter/setter
}
我有数据作为List<OrderDeatils>
列表
orderId. userId. OrderInfo[orderCreatedDate].
1001. 123. 2015/07/07
1002. 124. 2015/08/07
1003. 125. 2015/09/07
1004. 123. 2015/08/07
如何,我可以删除重复的条目基于userId,并保持数据与最小日期如下:
orderId. userId. OrderInfo[orderCreatedDate].
1001. 123. 2015/07/07
1002. 124. 2015/08/07
1003. 125. 2015/09/07
应该返回整个orderdetails对象的列表。
我试过了:
list.stream().collect(
Collectors.groupingBy(OrderDeatils::getUserId,
Collectors.collectingAndThen(
Collectors.reducing((OrderDeatils d1, OrderDeatils d2)
-> d1.getInfo.getOrderCreatedDate().isBefore(d2.getInfo.getOrderCreatedDate()) ? d1 : d2), Optional::get)));
但是响应不是预期的,我没有得到更新的List<OrderDeatils>
作为输出。
我不会为您编写代码,但以下是步骤:
- 你需要一个可以进行"合并"的
Collectors::toMap
;在第三个论点中。比如:
...collect(Collectors.toMap(
OrderDeatils::getUserId,
Function.identity(),
(left, right) ->
left.getInfo.getOrderCreatedDate().isBefore(right.getInfo.getOrderCreatedDate()) ? left : right
))
- 这将给你一个
Map<Long, OrderDeatils>
,你只需要值。
您可以使用一个简单的集合来进行过滤。如果添加到集合中,.add()方法将返回true,如果它是一个新值,如果该值已经存在于集合中,则返回false。
对于排序,您可以使用.sorted()并传递一个比较器来按所需字段排序。
Set<String> userIdsSet = new HashSet<>();
List<OrderDetails> filteredOrderDetails = list.stream()
.filter(e -> userIdsSet.add(e.getUserId()))
.sorted(Comparator.comparing(OrderDetails::getOrderCreatedDate()))
.collect(Collectors.toList());