Метод groupingBy
имеет первый параметр Function<T,K>
где:
@param
<T>
тип входных элементов@param
blockquote><K>
] тип ключейЕсли мы заменим лямбда на анонимный класс в вашем коде, мы увидим что-то вроде этого:
people.stream().collect(Collectors.groupingBy(new Function<Person, int>() { @Override public int apply(Person person) { return person.getAge(); } }));
Теперь измените выходной параметр
<K>
. В этом случае, например, я использовал парный класс из org.apache.commons.lang3.tuple для группировки по имени и возрасту, но вы можете создать свой собственный класс для фильтрации групп по мере необходимости.people.stream().collect(Collectors.groupingBy(new Function<Person, Pair<Integer, String>>() { @Override public YourFilter apply(Person person) { return Pair.of(person.getAge(), person.getName()); } }));
Наконец, после замены с помощью лямбда-кода код выглядит следующим образом:
Map<Pair<Integer,String>, List<Person>> peopleByAgeAndName = people.collect(Collectors.groupingBy(p -> Pair.of(person.getAge(), person.getName()), Collectors.mapping((Person p) -> p, toList())));