Java 8 Stream对映射后的LocalDate流排序不生效如何解决
问题原因
你的排序操作放在了flatMap的内部子流中,仅实现了每个客户单独的订单列表内部排序,所有客户的订单合并为全局流之后没有做统一排序。
举个例子:如果客户1的订单排序后是2019-02-17、2019-12-05、2020-03-15,客户2的订单排序后是2018-10-05、2020-07-15、2021-01-01,程序会先输出客户1的全部排好序的订单,再输出客户2的全部排好序的订单,最终结果自然没有全局升序效果。
修复方案
将排序操作移动到flatMap之后,对合并完成的全部日期做全局排序即可。LocalDate本身已实现Comparable接口,直接调用无参sorted()方法即可实现默认升序,无需额外自定义比较器:
clients.stream() .filter(client -> client.getOrders() != null) .flatMap(client -> client.getOrders().stream()) .map(Order::getDate) .sorted() .forEach(System.out::println);
如果你需要显式声明排序规则保持代码可读性,也可以选择两种等效写法:
- 保留
LocalDate::compareTo的写法,放在map提取日期之后即可 - 若使用
Comparator.comparing(Order::getDate)写法,需要将sorted放在map提取日期之前,否则流中元素类型已变为LocalDate,无法调用Order类的getDate方法
内容的提问来源于stack exchange,提问作者Kiji_T
相关产品推荐
相关产品推荐

