Java 8流删除重复条目,保留最小日期并返回更新的对象列表



我有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());

相关内容

  • 没有找到相关文章

最新更新