按 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)
我有一个 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)