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);