按 LocalDate 排序映射流

Sort by LocalDate a mapped stream

我有一个 class 客户端 ,其中包含 订单 的列表,还包含 LocalDate order_date .

并且使用 Java 8 个流,我想按日期对我的订单列表进行排序。

我有以下代码:

clients.getOrders().stream().map(Order::getDate).sorted(LocalDate::compareTo)).forEach(System.out::println)

但这绝对不是排序。我也试过 sorted(Comparator.comparing(Order::getDate)) 但打印出来的是一样的。

编辑 :

日期不同,我的整个代码行是这样的

clients.stream().filter(client -> client.getOrders() != null).flatMap(c -> c.getOrders().stream().map(Order::getDate).sorted(LocalDate::compareTo)).forEach(System.out::println)

我的输出是

2019-02-17
2019-12-05
2020-03-15
2018-10-05
2020-07-15
2021-01-01

Process finished with exit code 0

我想要这个

2018-10-05
2019-02-17
2019-12-05
2020-03-15
2020-07-15
2021-01-01

更新 问题中的实现似乎多次调用 client.getOrders() 。 不确定 client.getOrders() returns 是否每次调用都得到相同的结果。此外,它仅对日期进行排序,而不对订单进行排序。

以下代码仅进行一次 client.getOrders() 调用并对订单进行排序。

final List<Order> orders = clients.stream().map(clients -> client.getOrders())
.filter(Objects::nonNull)
.flatMap(orders -> orders.stream()) 
.sorted(Comparator.comparing(Order::getDate))
.collect(Collectors.toList());
//Printing orders' dates
orders.stream().map(Order::getDate).forEach(System.out::println);

信息基于第一个问题版本

根据现有的原始信息,这应该正常工作:

clients.getOrders().stream()
.sorted(Comparator.comparing(Order::getDate)) 
.forEach(System.out::println)

但是你已经提到你试过了。

另一种方法是使用集合。

final List<Order> orders=clients.getOrders();
Collections.sort(orders,Comparator.comparing(Order::getDate));
orders.stream().forEach(System.out::println);

我认为您排序错误的流。如果您先使用 flatMap 然后使用 sorted 它应该可以工作。

clients.stream().filter(client -> client.getOrders() != null).flatMap(c -> c.getOrders().stream()).sorted(Comparator.comparing(Order::getDate)).forEach(System.out::println)