Java 8 Stream 获取集合对象属性并去重后生成新的集合
在Java 8中,引入了Stream API,提供了一种更简洁、更高效的方式来处理集合数据。Stream API可以用来对集合进行各种操作,包括过滤、映射、排序等。
本文将介绍如何使用Java 8 Stream来获取集合对象的属性,并通过去重操作生成新的集合。我们将通过一个具体的示例来演示这个过程。
示例场景
假设我们有一个学生类Student,包含学生的姓名和年龄两个属性。现在我们有一个学生列表,我们希望根据学生的姓名获取一个不重复的学生姓名列表。
首先,我们定义Student类如下:
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// toString 方法
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
接下来,我们创建一个学生列表,并填充一些学生对象:
List<Student> students = new ArrayList<>();
students.add(new Student("Alice", 20));
students.add(new Student("Bob", 22));
students.add(new Student("Alice", 20));
students.add(new Student("Charlie", 21));
students.add(new Student("Bob", 22));
我们的目标是从这个学生列表中获取一个不重复的学生姓名列表。
使用Stream获取属性并去重
在Java 8中,我们可以使用Stream API来操作集合。首先,我们可以通过调用stream()
方法将集合转换为一个Stream对象:
Stream<Student> studentStream = students.stream();
接下来,我们可以使用map()
操作来获取学生的姓名属性。在map()
操作中,我们将每个学生对象映射为其姓名属性:
Stream<String> nameStream = studentStream.map(Student::getName);
在上面的代码中,Student::getName
是一个方法引用,表示获取学生对象的姓名属性。
最后,我们可以使用distinct()
操作来去重。distinct()
操作将移除流中的重复元素,只保留唯一的元素:
Stream<String> distinctNameStream = nameStream.distinct();
上述代码中,distinct()
操作将生成一个新的Stream对象,其中的元素是原Stream中唯一的元素。
生成新的集合
最后,我们可以使用collect()
操作来生成一个新的集合。collect()
操作接收一个Collector
参数,用于定义如何将Stream中的元素收集到一个集合中。
在本例中,我们可以使用Collectors.toList()
方法来将Stream收集到一个List对象中:
List<String> distinctNames = distinctNameStream.collect(Collectors.toList());
上述代码将distinctNameStream
中的元素收集到一个List对象distinctNames
中。
完整示例代码
下面是完整的示例代码:
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
List<Student> students = new ArrayList<>();
students.add(new Student("Alice", 20));
students.add(new Student("Bob", 22));
students.add(new Student("Alice", 20));
students.add(new Student("Charlie", 21));
students.add(new Student("Bob", 22));
Stream<Student> studentStream = students.stream();
Stream<String> nameStream = studentStream.map(Student::getName);
Stream<String> distinctNameStream = nameStream.distinct();
List<String> distinctNames = distinctNameStream.collect(Collectors.toList());
System.out.println("Distinct Names: " + distinctNames);
}
}
运行上述代码,输出结果为:
Distinct Names: [Alice, Bob, Charlie]
总结
本文介绍了如何使用Java 8 Stream来获取集合对象的属性,并通过去重操作生成新的集合。我们通过一个具体的示例演示了这个过程。使用Stream API可以使得代码更简洁