You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java 8 Streams按userId去重并保留最小日期的OrderDeatils对象

你的现有代码的分组筛选逻辑是正确的,问题在于Collectors.groupingBy的返回结果是Map<Long, OrderDeatils>类型(键为userId,值为对应用户最早创建的订单详情对象),你只需要提取Map的value集合再转为List即可。

正确实现代码

基于你原有逻辑的修改版

// JDK 16及以上版本
List<OrderDeatils> result = 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
                )
        ))
        .values()
        .stream()
        .toList();

// JDK 8版本,把最后的toList()替换为collect(Collectors.toList())
List<OrderDeatils> jdk8Result = 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
                )
        ))
        .values()
        .stream()
        .collect(Collectors.toList());

更易读的优化版本

可以用Collectors.minBy替代手动写reducing逻辑,可读性更强:

List<OrderDeatils> result = list.stream()
        .collect(Collectors.groupingBy(
                OrderDeatils::getUserId,
                Collectors.collectingAndThen(
                        Collectors.minBy(Comparator.comparing(d -> d.getInfo().getOrderCreatedDate())),
                        Optional::get
                )
        ))
        .values()
        .stream()
        .toList();

内容的提问来源于stack exchange,提问作者utpal sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:30:03