Java8: сбор потока в SortedMap по ключу - PullRequest
1 голос
/ 20 марта 2019

Я хочу собрать поток на карту, где отсортированы ключи, поэтому я попытался:

TreeMap<LocalDate, MenuChart2.Statistics> last3MPerDay =    

                menuPriceByDayService.findAllOrderByUpdateDate(menu, DateUtils.quarterlyDate(), 92)
                .stream()
                .sorted(comparing(MenuPriceByDay::getUpdateDate))
                .collect(Collectors
                        .toMap(MenuPriceByDay::getUpdateLocalDate, p -> new MenuChart2().new Statistics( p.getMinPrice().doubleValue(), 

Но я получил ошибку компиляции

Type mismatch: cannot convert from Map<LocalDate,Object> to 
 TreeMap<LocalDate,MenuChart2.Statistics>

Ответы [ 2 ]

5 голосов
/ 20 марта 2019

Если вы храните свои данные в отсортированной карте, например, TreeMap, вам не нужно создавать .sorted() версию потока;сборщик будет естественным образом сортировать данные, сохраняя их в TreeMap.

. Ваш .collect() вызов должен вернуть TreeMap, чтобы результат был присвоен TreeMap, поэтому Collectors.toMap() должен принять поставщика, который создает TreeMap для коллектора, чтобы разрешить распространение требуемого типа.

Например)

jshell> String[] data = { "apple", "pear", "orange", "cherry" };
data ==> String[4] { "apple", "pear", "orange", "cherry" }

jshell> var map = Arrays.stream(data)
   ...>                 .collect(Collectors.toMap(s -> s,
   ...>                                           s -> s.length(),
   ...>                                           (a,b) -> a,
   ...>                                           TreeMap::new));
map ==> {apple=5, cherry=6, orange=6, pear=4}

В результате TreeMap показывает данныеотсортировано по ключу.

1 голос
/ 20 марта 2019
Map<LocalDate, MenuChart2.Statistics> last3MPerDay =    

                menuPriceByDayService.findAllOrderByUpdateDate(menu, DateUtils.quarterlyDate(), 92)
                .stream()
                .sorted(comparing(MenuPriceByDay::getUpdateDate))
                .collect(Collectors
                        .toMap(MenuPriceByDay::getUpdateLocalDate, p -> new MenuChart2().new Statistics( p.getMinPrice().doubleValue());

TreeMap<LocalDate, , MenuChart2.Statistics> last3MPerDaySorted = new TreeMap<LocalDate, MenuChart2.Statistics>(last3MPerDay);
...