Java8对list根据对象属性去重
1. 整体流程
在实现“Java8对list根据对象属性去重”这个问题上,可以按照以下步骤进行操作:
步骤 | 描述 |
---|---|
1 | 创建一个包含重复元素的List |
2 | 使用Java8的Stream API进行去重操作 |
3 | 自定义一个去重的比较器 |
4 | 根据对象属性进行去重 |
5 | 将去重后的结果输出 |
2. 详细步骤
2.1 创建一个包含重复元素的List
首先,我们需要创建一个包含重复元素的List,这样我们才能测试去重操作的效果。以下是一个示例的Java代码:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Person> personList = new ArrayList<>();
personList.add(new Person("Alice", 20));
personList.add(new Person("Bob", 25));
personList.add(new Person("Alice", 20)); // 重复元素
personList.add(new Person("Charlie", 30));
personList.add(new Person("Alice", 20)); // 重复元素
// 打印原始List
System.out.println("原始List: " + personList);
}
static class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 省略getter和setter方法
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
}
这段代码创建了一个包含重复元素的personList
,其中Person
类是一个自定义的简单类,包含了name
和age
两个属性。
2.2 使用Java8的Stream API进行去重操作
Java8引入了Stream API,它提供了一种流式处理集合的方式,可以方便地进行各种操作,包括去重。以下是使用Stream API对List进行去重操作的Java代码:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
// 创建重复元素的List,省略...
// 使用Stream API进行去重操作
List<Person> distinctPersonList = personList.stream()
.distinct() // 去重
.collect(Collectors.toList()); // 转换为List
// 打印去重后的结果
System.out.println("去重后的List: " + distinctPersonList);
}
// 省略Person类的定义
}
在这段代码中,我们首先使用stream()
方法将List转换为Stream,然后使用distinct()
方法对Stream进行去重操作,最后使用collect(Collectors.toList())
方法将去重后的结果转换为List。
2.3 自定义一个去重的比较器
默认情况下,Stream API对对象进行去重操作会使用对象的equals()
方法和hashCode()
方法,但是在复杂的情况下可能无法满足需求。我们可以自定义一个去重的比较器来解决这个问题。以下是一个示例的Java代码:
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
// 创建重复元素的List,省略...
// 使用自定义的去重比较器进行去重操作
List<Person> distinctPersonList = personList.stream()
.distinctBy(Person::getName) // 使用姓名进行去重
.collect(Collectors.toList());
// 打印去重后的结果
System.out.println("去重后的List: " + distinctPersonList);
}
// 省略Person类的定义
static class Person {
// 省略name和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 Objects.equals(name, person.name);
}
// 自定义的hashCode方法,仅考虑姓名
@Override
public int hashCode