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
类,包含 name
和 age
两个属性,并重写了 equals
方法。然后我们创建了一个 persons
列表,其中包含了重复的 Person
对象。通过使用 stream
方法将列表转换为流,然后使用 distinct
方法去除重复元素,最后使用 collect
方法将结果收集到一个新的列表中。输出为去除重复元素后的列表。
注意事项
需要注意的是,在使用 distinct
方法时,被比较的对象需要正确重写 equals
方法和 hashCode
方法,以确保对象的相等性判断是准确的。否则,distinct
方法可能无法正确地去除重复元素。
总结
本文介绍了 Java Stream 中的 distinct
方法的使用方法和示例。该方法可以方便地去除流中的重复元素,使得数据处理更加简便和高效。在使用 distinct
方法时,需要注意被比较的对象需要正确地重写了 equals
方法和 hashCode
方法,以确保对象的相等性判断准确无误。