如何用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
相关产品推荐
相关产品推荐

