在Java中,使用Stream流进行多次分组可以通过多次调用Collectors.groupingBy方法实现。每次调用groupingBy方法都会将元素按照指定的分类条件进行分组。

import java.util.*;
import java.util.stream.Collectors;

public class StreamGroupingExample {
    public static void main(String[] args) {
        List<Person> persons = Arrays.asList(
                new Person("Alice", 25, "Female"),
                new Person("Bob", 30, "Male"),
                new Person("Charlie", 35, "Male"),
                new Person("Diana", 28, "Female"),
                new Person("Eva", 25, "Female"),
                new Person("Frank", 30, "Male")
        );

        // 第一次分组:按性别分组
        Map<String, List<Person>> genderGroups = persons.stream()
                .collect(Collectors.groupingBy(Person::getGender));

        System.out.println("按性别分组结果:");
        System.out.println(genderGroups);

        // 第二次分组:在每个性别组内按年龄分组
        Map<String, Map<Integer, List<Person>>> ageGroups = persons.stream()
                .collect(Collectors.groupingBy(Person::getGender,
                        Collectors.groupingBy(Person::getAge)));

        System.out.println("按性别和年龄分组结果:");
        System.out.println(ageGroups);
    }

    static class Person {
        private String name;
        private int age;
        private String gender;

        public Person(String name, int age, String gender) {
            this.name = name;
            this.age = age;
            this.gender = gender;
        }

        public String getName() {
            return name;
        }

        public int getAge() {
            return age;
        }

        public String getGender() {
            return gender;
        }

        @Override
        public String toString() {
            return name;
        }
    }
}

输出结果:

按性别分组结果:
{Female=[Alice, Diana, Eva], Male=[Bob, Charlie, Frank]}
按性别和年龄分组结果:
{Female={25=[Alice, Eva], 28=[Diana]}, Male={30=[Bob, Frank], 35=[Charlie]}}

首先按照性别对Person对象进行分组。然后,在每个性别组内再按照年龄对Person对象进行分组。通过多次使用Collectors.groupingBy方法,我们实现了多次分组。