如何在流中收集到TreeMap?

How to collect into TreeMap in stream?

我在 Stream 中有两个 Collectors.groupingBy。我需要收集所有信息到 TreeMap.

我的代码:

Map<LocalDate, Map<String, List<RollingField>>> fieldMap = rollingFields.stream().collect(
    Collectors.groupingBy(
            RollingField::getDate,
            Collectors.groupingBy(fi -> fi.getMeta().getName())));

还有这个returnHashMap。我需要为 returning TreeMap 添加什么?我需要这个按 LocalDate.

排序

使用允许通过Supplier提供Map工厂的特定方法即
Collectors.groupingBy(Function<..> classifier, Supplier<M> mapFactory, Collector<..> downstream) 其中:

  • classifier 将元素映射到键
  • mapFactory 生成一个新的空映射(这里使用 () -> new TreeMap<>()
  • downstream下游减少

实施:

Map<LocalDate, Map<String, List<RollingField>>> fieldMap = rollingFields.stream().collect(
        Collectors.groupingBy(
                RollingField::getDate,                // outer Map keys
                TreeMap::new,                         // outer Map is TreeMap
                Collectors.groupingBy(                // outer Map values
                        fi -> fi.getMeta().getName(), // inner Map keys
                        TreeMap::new,                 // inner Map is TreeMap
                        Collectors.toList()           // inner Map values (default)
                )
        ));

不用担心没有downstream就没有Collectors.groupingBy(Function<..> classifier, Supplier<M> mapFactory)这样的重载方法。 downstream 的默认实现是收集到 List,因此可以自由重用它 (Collectors.toList()),来自 JavaDoc:

This produces a result similar to: groupingBy(classifier, toList());