Java Lambda Distinct 指定字段

在Java 8之后,引入了Lambda表达式和Stream API,使得处理集合数据变得更加简洁和高效。其中,Distinct操作可以用于移除重复的元素,使得集合中的元素具有唯一性。本文将介绍如何使用Lambda表达式和Stream API中的Distinct操作来根据指定字段进行去重。

Lambda 表达式的简介

Lambda表达式是Java中的一种匿名函数,可以将其作为参数传递给方法或存储在变量中。Lambda表达式省略了匿名方法的定义,使得代码更加简洁和易读。Lambda表达式使用箭头符号(->)将参数列表和函数体分隔开来,如下所示:

(parameter1, parameter2, ..., parameterN) -> { 
    // Lambda 表达式的函数体
}

Lambda表达式的参数列表可以为空,或者包含一个或多个参数。函数体可以是一个表达式或一个代码块。如果函数体只有一条语句,则可以省略花括号。Lambda表达式可以通过上下文推断参数的类型,也可以显式指定参数的类型。

Stream API 的简介

Stream API 是Java 8中用于处理集合数据的新特性。Stream(流)表示一系列的元素,可以进行各种操作,例如过滤、映射、排序等。Stream API 提供了丰富的函数式接口和方法,使得处理集合数据变得更加简洁和高效。

使用 Lambda 表达式和 Stream API 进行去重

在处理集合数据时,我们经常遇到需要去除重复元素的情况。Stream API 中的Distinct操作可以用于移除重复的元素。默认情况下,Distinct操作根据元素的equals方法判断元素是否相等。但是,有时我们需要根据指定字段进行去重,这就需要使用Lambda表达式来指定判断元素相等的字段。

下面是一个示例代码,演示了如何使用Lambda表达式和Stream API对集合进行去重,并根据指定字段判断元素相等:

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

public class DistinctExample {
    public static void main(String[] args) {
        // 创建一个包含重复元素的集合
        List<Person> persons = new ArrayList<>();
        persons.add(new Person("Alice", 20));
        persons.add(new Person("Bob", 30));
        persons.add(new Person("Alice", 20));
        persons.add(new Person("Charlie", 40));

        // 使用 Lambda 表达式和 Stream API 进行去重
        List<Person> distinctPersons = persons.stream()
                .distinct()
                .toList();

        // 打印去重后的集合
        System.out.println(distinctPersons);
    }
}

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 && name.equals(person.name);
    }

    @Override
    public int hashCode() {
        return name.hashCode() + age;
    }

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

在上述示例代码中,我们创建了一个包含重复元素的Person集合。然后,使用Lambda表达式和Stream API的Distinct操作进行去重。为了根据指定字段判断元素相等,我们在Person类中重写了equals方法,并根据name和age字段进行判断。最后,打印去重后的集合,输出结果为:

[Person{name='Alice', age=20}, Person{name='Bob', age=30}, Person{name='Charlie', age=40}]

总结

本文介绍了如何使用Lambda表达式和Stream API中的Distinct操作对集合进行去重,并根据指定字段判断元素相等。通过使用Lambda表达式,我们可以简洁地指定判断元素相等的字段