Как создать новую карту из значений в существующей карте - PullRequest
0 голосов
/ 20 декабря 2018

Имея следующую исходную карту:

G1=[7,8,45,6,9]
G2=[3,9,34,2,1,65]
G3=[6,5,9,1,67,5]

Где G1, G2 и G3 - группы возрастов людей. Как я могу создать новую карту, подобную этой:

45=[7,8,45,6,9]
65=[3,9,34,2,1,65]
67=[6,5,9,1,67,5]

Гденовые ключи - максимальный возраст людей в каждой группе.

Я пробовал это:

Map<Integer, List<Integer>> newMap = originalMap.entrySet().stream()
                .collect(Collectors.toMap(Collections.max(x -> x.getValue()), x -> x.getValue()));

Но компилятор говорит мне: «Тип цели этого выражения должен быть функциональным интерфейсом"в этом фрагменте кода:

Collections.max(x -> x.getValue())

Любая помощь с этим будет оценена.

1 Ответ

0 голосов
/ 20 декабря 2018

toMap потребляет функцию для keyMapper и valueMapper.Вы делаете это правильно для valueMapper в вашем коде, но не для keyMapper, поэтому вам нужно включить функцию keyMapper следующим образом:

originalMap.entrySet()
           .stream()
           .collect(toMap(e -> Collections.max(e.getValue()), Map.Entry::getValue));

обратите внимание на e -> Collections.max(e.getValue()).

Кроме того, поскольку вы не работаете с ключами карты, вы можете избежать вызова entrySet () и вместо этого работать со значениями карты:

originalMap.values()
           .stream()
           .collect(Collectors.toMap(Collections::max, Function.identity()));
...