Java Stream distinct

Java Stream distinct

Java Stream distinct

介绍

Java Stream 是 Java 8 引入的一个功能强大的用于处理集合数据的 API。它提供了一种流式处理的方式,可以方便地对集合进行过滤、转换、聚合等操作。在 Stream API 中,有一个非常有用的方法 distinct,用于去除流中的重复元素。本文将详细介绍 Java Stream distinct 方法的用法和示例。

使用方法

distinct 方法是 Stream API 中的一个中间操作(Intermediate Operation),它返回一个去除重复元素的新流。使用该方法的一般形式如下:

Stream<T> distinct()

distinct 方法没有参数,它会根据元素的 equals 方法来判断元素是否相同。如果流中存在重复元素,则只保留第一个出现的元素,后续的重复元素都会被去除。

示例

下面我们通过一些示例代码来说明 distinct 方法的使用。

基本数据类型

首先,我们来看一个基本数据类型的示例。

List<Integer> numbers = Arrays.asList(1, 2, 3, 2, 4, 3, 5, 4, 6);

List<Integer> distinctNumbers = numbers.stream()
                                      .distinct()
                                      .collect(Collectors.toList());

System.out.println(distinctNumbers);

运行结果:

[1, 2, 3, 4, 5, 6]

在上面的示例中,我们定义了一个包含重复元素的整型列表 numbers。通过使用 stream 方法将列表转换为流,然后使用 distinct 方法去除重复元素,最后使用 collect 方法将结果收集到一个新的列表中。输出为去除重复元素后的列表。

自定义类型

除了基本数据类型外,distinct 方法也可以用于自定义类型。我们可以自定义一个类,在该类中重写 equals 方法来定义两个对象相等的判定规则。

下面是一个自定义类的示例代码:

class Person {
    private String name;
    private int age;

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

    // 重写 equals 方法
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Person person = (Person) obj;
        return age == person.age && Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

List<Person> persons = Arrays.asList(
        new Person("Alice", 18),
        new Person("Bob", 20),
        new Person("Alice", 18),
        new Person("Charlie", 25)
);

List<Person> distinctPersons = persons.stream()
                                      .distinct()
                                      .collect(Collectors.toList());

System.out.println(distinctPersons);

运行结果:

[Person{name='Alice', age=18}, Person{name='Bob', age=20}, Person{name='Charlie', age=25}]

在上述示例中,我们定义了一个 Person 类,包含 nameage 两个属性,并重写了 equals 方法。然后我们创建了一个 persons 列表,其中包含了重复的 Person 对象。通过使用 stream 方法将列表转换为流,然后使用 distinct 方法去除重复元素,最后使用 collect 方法将结果收集到一个新的列表中。输出为去除重复元素后的列表。

注意事项

需要注意的是,在使用 distinct 方法时,被比较的对象需要正确重写 equals 方法和 hashCode 方法,以确保对象的相等性判断是准确的。否则,distinct 方法可能无法正确地去除重复元素。

总结

本文介绍了 Java Stream 中的 distinct 方法的使用方法和示例。该方法可以方便地去除流中的重复元素,使得数据处理更加简便和高效。在使用 distinct 方法时,需要注意被比较的对象需要正确地重写了 equals 方法和 hashCode 方法,以确保对象的相等性判断准确无误。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程