Java流:多重分组

Java流:多重分组,java,lambda,java-stream,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> personsGrou

我可以按一个字段分组,但我想同时按两个字段分组

//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 

    ???

我的建议是创建一个helper类,它表示分组键性别和年龄,在本例中,使用适当的equals和hashCode实现。然后,您可以创建一个从Person到该键的映射器函数,并据此进行分组。

我的建议是创建一个helper类,该类表示分组键的性别和年龄,在本例中,使用适当的equals和hashCode实现。然后,您可以创建一个从您的个人到该键的映射器函数,并按该键分组。

您可以分组两次,结果将与您期望的结果相同,但包装方式略有不同

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

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

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

.getAge返回一个字符串?我更正了one@Marvy可能是地图吗?可能是输入错误。getAge返回字符串?我更正了one@Marvy可能是地图吗?可能是一个打字错误。总体而言,这是一个不错的建议,虽然我没有投反对票,但你可能得到了它,因为你还应该显示一些代码……总体而言,这是一个不错的建议,虽然我没有投反对票,但你可能得到了它,因为你也应该显示一些代码……@Marvy,如果它有帮助的话,不妨接受它@马维,如果有帮助的话,不妨接受它。
Map<Pair<String, String>, Long> personsGroupedByGenderAge = persons.stream()
    .collect(Collectors.groupingBy(
         person -> Pair.of(person.getGender, person.getAge),
         Collectors.counting()));