在Java 8中,如果你想要根据对象的多个属性去除List
中的重复元素,你可以使用Stream
API结合Collectors.toMap
(或Collectors.groupingBy
如果你还需要收集所有相同的元素)来实现。由于Collectors.toMap
要求你提供一个keyMapper和一个valueMapper,而在这里我们主要是为了去重,所以可以将整个对象作为value(或者如果你不需要保留所有重复项,只保留一个,则可以忽略valueMapper),并使用这些属性来构造一个唯一的key。
以下是一个示例,假设我们有一个Person
类,我们想根据name
和age
属性去除重复项:
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
class Person {
private String name;
private int age;
// 构造器、getter和setter省略
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
// 假设有getter
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class Main {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
people.add(new Person("Alice", 30)); // 重复项
// 使用Stream API和Collectors.toMap去除重复项
List<Person> uniquePeople = people.stream()
.collect(Collectors.toMap(
person -> person.getName() + "_" + person.getAge(), // 唯一键
Function.identity(), // 值就是Person对象本身
(existing, replacement) -> existing)) // 冲突时保留现有的
.values().stream()
.collect(Collectors.toList()); // 将Map的values转换为List
uniquePeople.forEach(System.out::println);
}
}
在这个例子中,我们使用person.getName() + "_" + person.getAge()
作为键来确保基于name
和age
的唯一性。当遇到具有相同键的多个Person
对象时,我们通过(existing, replacement) -> existing
来指定保留先遇到的元素。最后,我们通过调用.values().stream().collect(Collectors.toList())
来将Map
的values
(即去重后的Person
对象)转换回List
。
这种方法简洁而有效,适用于需要根据多个属性去重的场景。
--end--