如何排序地图<yearmonth,list <localdate =“”>&gt;使用java 8 lambda和streams

时间:2016-07-07 06:44:42

标签: java sorting date java-8 java-stream

我有一个这样的排序日期列表:

2016-07-07
2016-07-08
2016-07-09
2016-07-10
2016-07-11
2016-07-12
2016-07-13
...
2016-07-31
2016-08-01
2016-08-02
2016-08-03
...
2017-01-01
2017-01-02
2017-01-03
...

从这个列表中我生成一个带有流的Map<YearMonth, List<LocalDate>>

Map<YearMonth, List<LocalDate>> d = dates.stream().collect(Collectors.toList())
      .stream().collect(Collectors.groupingBy(date -> YearMonth.from(date)));

该地图的输出如下所示:

{2016-12=[2016-12-01, 2016-12-02,...2016-12-31], 2016-11=[2016-11-01, 2016-11-02,...]}

但我需要的输出应该是这样的:

  • 按日期升序排序的地图键:{2016-07=[...], 2016-08=[...]}
  • 按日期升序排序的地图(列表)的值:{2016-07=[2016-07-01, 2016-07-02, ...], 2016-08=[2016-08-01, 2016-08-02, ...]}

我尝试了很多选项以获得我的预期结果,但我只是对键或值进行了正确的排序,而不是两者都

Map<YearMonth, List<LocalDate>> m = stream().collect(Collectors.toList())
      .stream().sorted((e1,e2) -> e2.compareTo(e1))
      .collect(Collectors.groupingBy(date -> YearMonth.from(date)));

结果:

{2016-07=[2016-07-31, 2016-07-30, ...], 2016-08=[2016-08-31, 2016-08-30, ...]}

如何按键和值对其进行排序?

4 个答案:

答案 0 :(得分:3)

使用TreeMap作为收集器,因此输出按键排序。

这样的事情:

 dates.stream()
      .sorted()
      .collect(
         Collectors.groupingBy(YearMonth::from, TreeMap::new, Collectors.toList())
      );

答案 1 :(得分:2)

Collectors.groupingBy(date -> YearMonth.from(date))在内部将结果存储在HashMap中,并且密钥排序丢失。

此实现将保留键顺序:

  Map<YearMonth, List<LocalDate>> d = dates
        .stream()
        .sorted((e1,e2) -> e2.compareTo(e1))
        .collect(Collectors
                .groupingBy(YearMonth::from,
                        LinkedHashMap::new,
                        Collectors.toList()));

答案 2 :(得分:0)

您可以使用返回已排序集合的特定Collectors。 在您的情况下,我将使用TreeMap按键对结果Map进行排序,并显式对结果值集合进行排序:

Map<YearMonth, List<LocalDate>> m = dates.stream()
   .collect(Collectors.groupingBy(
              date -> YearMonth.from(date),
              TreeMap::new,
              Collectors.collectingAndThen(
                Collectors.toList(),
                (list) -> { Collections.sort(list); return list; })));

答案 3 :(得分:0)

您可以按以下方式对它们进行排序: -

Map<YearMonth, List<LocalDate>> map = dates.stream()
        .collect(Collectors.toList())
        .stream()
        .sorted((e1,e2) -> e1.compareTo(e2))
        .collect(Collectors.groupingBy(date -> YearMonth.from(date), TreeMap::new, Collectors.toList()));