在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--