您的位置:

如何消除Lambda中重复项

一、使用distinct()

Lambda表达式可以从集合中筛选出唯一的元素,使用distinct()方法可以帮助消除Lambda中的重复项。该方法会找出集合中的不同元素,并返回唯一的元素集合。
ArrayList numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 2, 4, 5, 1));
List
    distinctNumbers = numbers.stream().distinct().collect(Collectors.toList());

   
  

在上面的代码中,我们创建了一个整数类型的集合,并使用distinct()方法来查找集合中的不同元素。最终将其收集到列表中。结果是[1, 2, 3, 4, 5], 集合中所有的重复元素都被消除了。

二、使用toSet()

toSet()方法是将元素添加到Set集合中,而Set集合不允许重复元素存在,因此重复元素在添加时会被自动去除。通过List的stream()方法,将List转换为Stream,然后通过collect()方法将Stream转换为Set,重复元素自动去重。
ArrayList numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 2, 4, 5, 1));
Set
    uniqueNumbers = numbers.stream().collect(Collectors.toSet());

   
  

在上面的代码中,我们将一个整数类型的集合转换为了Set,重复元素已被消除,最终uniqueNumbers包含了集合中所有的唯一元素。

三、使用groupingBy()和collect()

如果我们需要将集合中的元素按照某个属性进行分组,同时去除重复元素,那么我们可以使用groupingBy()和collect()方法。
public class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

List persons = Arrays.asList(new Person("Tom", 20),
        new Person("Tom", 25),
        new Person("Jack", 30),
        new Person("Kate", 30));

Map
   > uniquePersonNamesByAge =
        persons.stream().collect(Collectors.groupingBy(Person::getAge,
                Collectors.mapping(Person::getName, Collectors.toSet())));

   
  

在上面的代码中,我们创建了Person类,使用groupingBy()方法按照年龄进行分组,同时使用mapping()和toSet()方法将各组中的姓名去重,最终uniquePersonNamesByAge包含了按年龄分组的所有唯一姓名。

四、使用HashSet

我们也可以使用一个HashSet集合来帮助消除Lambda中的重复项。
ArrayList numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 2, 4, 5, 1));
Set
    uniqueNumbers = new HashSet<>(numbers);

   
  

在上面的代码中,我们创建一个整数类型的HashSet,将原始的集合中的元素添加到HashSet中。由于HashSet不允许重复元素,因此所有重复元素都被自动去除,最终uniqueNumbers包含集合中的所有唯一元素。