Java Stream:多个分组

时间:2017-05-10 19:52:08

标签: java lambda java-stream

我可以按一个字段进行分组,但我希望将它们组合在一起

//persons grouped by gender
Map<String, Long> personsGroupedByGender = persons.stream().collect(Collectors.groupingBy(Person::getGender, Collectors.counting()));

//persons grouped by age
Map<Int, Long> personsGroupedByAge = persons.stream().collect(Collectors.groupingBy(Person::getAge, Collectors.counting()));

//persons grouped by gender and age 

    ???

3 个答案:

答案 0 :(得分:2)

你可以分组两次,结果将是你所期望的,但是包装略有不同。

persons.stream().collect(Collectors.groupingBy(Person::getGender,  
              Collectors.groupingBy(Person::getAge, Collectors.counting())));

答案 1 :(得分:1)

我的建议是创建一个帮助程序类,它代表您的分组键(在这种情况下是性别和年龄),具有适当的Predicateequals实现。然后,您可以从hashCode到此密钥创建映射器函数,并按此分组。

答案 2 :(得分:0)

import org.apache.commons.lang3.tuple.Pair;
Map<Pair<String, String>, Long> personsGroupedByGenderAge = persons.stream()
    .collect(Collectors.groupingBy(
         person -> Pair.of(person.getGender, person.getAge),
         Collectors.counting()));