从列表 java8 中删除重复项

问题描述 投票:0回答:3

我下面有一个类,想要删除包含相同名称的重复人员,如何使用 Java8 Lambda 执行此操作,预期列表包含下面的 p1、p3。

人:

public class Person {

public int id;
public String name;
public String city;

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getCity() {
    return city;
}

public void setCity(String city) {
    this.city = city;
}

}

测试:

import java.util.ArrayList;
import java.util.List;

public class Testing {

public static void main(String[] args) {

    List<Person> persons = new ArrayList<>();

    Person p1 = new Person();
    p1.setId(1);
    p1.setName("Venkat");
    p1.setCity("Bangalore");
    Person p2 = new Person();

    p2.setId(2);
    p2.setName("Venkat");
    p2.setCity("Bangalore");

    Person p3 = new Person();
    p3.setId(3);
    p3.setName("Kumar");
    p3.setCity("Chennai");

    persons.add(p1);
    persons.add(p2);
    persons.add(p3);

}
}
java-8
3个回答
37
投票

您可以过滤掉它们并生成一个独特的

Set

Set<Person> set = persons.stream()
            .collect(Collectors.toCollection(() -> 
                 new TreeSet<>(Comparator.comparing(Person::getName))));

或者更好:

Set<String> namesAlreadySeen = new HashSet<>();

persons.removeIf(p -> !namesAlreadySeen.add(p.getName()));

36
投票

distinct() 函数可用于通过自然比较来删除重复项,首先重写 Person 类中的 equals() 和 hashCode() 方法。

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

注意:可以使用Comparator接口进行自定义比较。


0
投票
List<Person> modified = pesrons.stream().collect(Collectors.toCollection(()->new TreeSet<>(Comparator.comparing(Person::getName)))).stream().collect(Collectors.toList());

这将返回基于名称的非重复列表。

您也可以参考此内容根据Java 8中的属性从对象列表中删除重复项

© www.soinside.com 2019 - 2024. All rights reserved.