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可以使得代码更简洁










