Используйте метод Speci c, который позволяет обеспечить фабрику Map
через Supplier
, то есть
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)
)
));
Не беспокойтесь, что не существует такого перегруженного метода, как Collectors.groupingBy(Function<..> classifier, Supplier<M> mapFactory)
без downstream
. Реализация по умолчанию downstream
собирает в List, поэтому можно свободно использовать его (Collectors.toList()
) из JavaDo c:
. Это дает аналогичный результат до: groupingBy(classifier, toList());