java8的stream中怎么对一个类里面的某个字段实现去重

目录

  • 方式1:使用 distinct 方法结合自定义的 equals和 hashCode方法来实现
  • 方式2:使用 collect方法结合 toMap 方法来实现字段去重
  • 方式3:利用 LinkedHashSet 的特性来实现字段去重

方式1:使用 distinct 方法结合自定义的 equals和 hashCode方法来实现

在 Java 8 的 Stream 中对一个类的某个字段实现去重,你可以使用 distinct 方法结合自定义的 equalshashCode 方法来实现。以下是一种可能的实现方式:

假设你有一个类 Person,其中包含一个字段 name,你想对 name 字段进行去重操作。

首先,在 Person 类中,确保你已经重写了 equalshashCode 方法,以便根据 name 字段进行比较和去重。例如:

public class Person {
    private String name;

    // 构造函数、其他字段和方法

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

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

接下来,假设你有一个包含多个 Person 对象的列表,你可以通过 Stream 进行去重操作。例如:

List<Person> personList = ... // 假设你有一个 Person 对象的列表

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

在上述代码中,我们使用 stream() 方法将列表转换为 Stream,然后使用 distinct() 方法对 Person 对象进行去重操作。最后,使用 collect() 方法将去重后的结果收集为一个新的列表 distinctPersons

方式2:使用 collect方法结合 toMap 方法来实现字段去重

使用 collecttoMap 方法:你可以使用 collect 方法结合 toMap 方法来实现字段去重。首先,将对象流转换为 Map,其中键是要去重的字段,值是对象本身。然后,提取 Map 中的值集合,即可得到去重后的结果。例如:

List<Person> personList = ... // 假设你有一个 Person 对象的列表

List<Person> distinctPersons = personList.stream()
        .collect(Collectors.toMap(Person::getName, Function.identity(), (p1, p2) -> p1))
        .values()
        .stream()
        .collect(Collectors.toList());

在上述代码中,我们使用 toMap 方法将 Person 对象流转换为 Map,其中键是 name 字段,值是对象本身。当遇到重复的键时,我们使用合并函数 (p1, p2) -> p1 来选择保留哪个值。然后,通过提取 Map 的值集合,我们获得了去重后的结果。

方式3:利用 LinkedHashSet 的特性来实现字段去重

使用 LinkedHashSet:你可以利用 LinkedHashSet 的特性来实现字段去重。创建一个 LinkedHashSet 对象,并使用 addAll 方法将对象流添加到集合中。由于 LinkedHashSet 会保留元素的插入顺序并去除重复元素,所以你可以通过将 LinkedHashSet 转换为列表来得到去重后的结果。例如:

List<Person> personList = ... // 假设你有一个 Person 对象的列表

List<Person> distinctPersons = new ArrayList<>(new LinkedHashSet<>(personList));

在上述代码中,我们使用 LinkedHashSet 来去除重复元素,并将其转换为 ArrayList,从而获得去重后的结果。

你可能感兴趣的:(java,java,笔记)