【问题标题】:Java 8 Streams remove duplicates entry, keep which have min date and return updated List of objectJava 8 Streams 删除重复条目,保留最小日期并返回更新的对象列表
【发布时间】:2021-11-16 04:48:39
【问题描述】:

我有类似的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 

应该返回整个 OrderDetils 对象的列表。

我试过了:

 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> 作为输出。

【问题讨论】:

    标签: java list stream java-stream grouping


    【解决方案1】:

    您可以使用一个简单的集合来进行过滤。 添加到集合后 - 如果它是一个新值,.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());
    

    【讨论】:

    【解决方案2】:

    我不会为你写代码,但步骤如下:

    • 您需要一个Collectors::toMap,它可以在第三个参数中进行“合并”。比如:
    ...collect(Collectors.toMap(
         OrderDeatils::getUserId,
         Function.identity(),
         (left, right) ->
            left.getInfo.getOrderCreatedDate().isBefore(right.getInfo.getOrderCreatedDate()) ? left : right        
    ))
    
    • 这将为您提供一个 Map&lt;Long, OrderDeatils&gt;,您只需要从中获取值。

    【讨论】:

    • 谢谢它的工作......如果OrderInfo是OrderDeatils的父类......关于这个的小问题......像OrderDeatils扩展OrderInfo......我们将得到相同的输出......抱歉问问题应该创建一个新线程。但如果你能提供一些意见。
    • @utpalsharma 你的问题在哪里?
    • 谢谢我会创造新的
    猜你喜欢
    • 2019-04-29
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多