Java 8 Stream 分组取第一个

在Java 8中,引入的Stream API为我们提供了一种更加便捷和高效的方式来处理集合数据。使用Stream可以轻松地对集合进行过滤、映射、排序和分组等操作。本文将重点介绍如何使用Stream对集合进行分组,并取出每个分组中的第一个元素。

什么是Stream?

Stream是Java 8中新增的一种处理集合数据的方式。它可以看作是一种与集合类似的数据结构,但不同的是它并不存储数据,而是对数据进行各种操作。使用Stream可以提供更加简洁、高效和易于理解的代码,同时也可以充分发挥多核处理器的优势。

流程图

下面是使用Mermaid语法绘制的流程图,展示了使用Stream对集合进行分组取第一个元素的流程:

graph LR
A[创建数据源] --> B[创建Stream]
B --> C[定义分组规则]
C --> D[分组]
D --> E[取第一个元素]
E --> F[输出结果]

代码示例

接下来,让我们通过一个具体的例子来演示如何使用Stream对集合进行分组,并取出每个分组中的第一个元素。

假设我们有一个包含多个人员信息的列表,每个人员信息包括姓名和年龄。我们想要按照年龄分组,并取出每个分组中年龄最小的人员信息。

首先,我们需要创建一个包含人员信息的列表:

import java.util.ArrayList;
import java.util.List;

public class Person {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

public class Main {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person("Alice", 25));
        personList.add(new Person("Bob", 30));
        personList.add(new Person("Charlie", 20));
        personList.add(new Person("David", 25));
        personList.add(new Person("Emma", 30));
        personList.add(new Person("Frank", 20));
    }
}

接下来,我们可以使用Stream对人员信息进行分组,并取出每个分组中年龄最小的人员信息。首先,我们需要根据年龄进行分组:

import java.util.Map;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        // ...

        // 分组
        Map<Integer, List<Person>> groupedByAge = personList.stream()
            .collect(Collectors.groupingBy(Person::getAge));
    }
}

上述代码中,我们使用Collectors.groupingBy方法对人员信息进行分组,分组的依据是Person::getAge即根据年龄进行分组。

接着,我们需要取出每个分组中年龄最小的人员信息。可以使用Collectors.minBy方法来获取每个分组中的最小元素:

import java.util.Comparator;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        // ...

        // 分组
        Map<Integer, Optional<Person>> minAgeByGroup = personList.stream()
            .collect(Collectors.groupingBy(Person::getAge, Collectors.minBy(Comparator.comparingInt(Person::getAge))));
    }
}

在上述代码中,我们使用Collectors.minBy方法来获取每个分组中年龄最小的人员信息,比较的依据是Comparator.comparingInt(Person::getAge)即根据年龄进行比较。

最后,我们可以输出结果:

import java.util.Comparator;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        // ...

        // 分组
        Map<Integer, Optional<Person>> minAgeByGroup = personList.stream()
            .collect(Collectors.groupingBy(Person::getAge, Collectors.minBy(Comparator.comparingInt(Person::getAge))));

        // 输出结果
        minAgeByGroup.forEach((age, person) -> {
            System.out.println("Age: " + age);