Java 如何去重对象集合
引言
在Java开发中,我们经常需要处理对象集合,有时候需要对集合进行去重操作,即移除集合中重复的对象,只保留一个。本文将介绍几种常用的去重方案,并提供相应的代码示例。
方案一:使用Set集合去重
Set是Java中的一种集合,它不允许包含重复的元素。我们可以利用Set集合的特性来去重对象集合。
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class ObjectUtils {
public static <T> List<T> removeDuplicates(List<T> list) {
Set<T> set = new HashSet<>(list);
list.clear();
list.addAll(set);
return list;
}
}
上述代码中,我们通过创建一个HashSet对象,传入原始集合list来去重。然后清空原始集合,并将去重后的集合重新添加进去。
使用示例:
List<String> list = new ArrayList<>();
list.add("apple");
list.add("orange");
list.add("banana");
list.add("apple");
list.add("orange");
List<String> result = ObjectUtils.removeDuplicates(list);
System.out.println(result); // 输出:[apple, orange, banana]
方案二:使用HashMap去重
HashMap是Java中的一种映射表,它可以存储键值对,其中键是唯一的。我们可以利用HashMap的键唯一性来去重对象集合。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ObjectUtils {
public static <T, K> List<T> removeDuplicates(List<T> list, Map<K, T> map, Function<T, K> keyExtractor) {
for (T item : list) {
K key = keyExtractor.apply(item);
map.put(key, item);
}
return new ArrayList<>(map.values());
}
}
上述代码中,我们通过遍历原始集合list,将每个对象的关键属性(如id)作为键,对象本身作为值存入HashMap。由于HashMap的键是唯一的,重复的对象会被自动去重。最后,我们通过获取HashMap的values视图,将去重后的对象集合返回。
使用示例:
class Person {
private String id;
private String name;
// getter and setter
}
List<Person> list = new ArrayList<>();
Person person1 = new Person("1", "Alice");
Person person2 = new Person("2", "Bob");
Person person3 = new Person("1", "Alice"); // 与person1的id相同,应该被去重
list.add(person1);
list.add(person2);
list.add(person3);
Map<String, Person> map = new HashMap<>();
List<Person> result = ObjectUtils.removeDuplicates(list, map, Person::getId);
System.out.println(result); // 输出:[Person(id=1, name=Alice), Person(id=2, name=Bob)]
方案三:使用Java 8的Stream API去重
Java 8引入了Stream API,它提供了强大的函数式编程特性,也可以用来去重对象集合。
import java.util.ArrayList;
import java.util.List;
public class ObjectUtils {
public static <T, K> List<T> removeDuplicates(List<T> list, Function<T, K> keyExtractor) {
return list.stream()
.collect(Collectors.toMap(keyExtractor, Function.identity(), (a, b) -> a))
.values()
.stream()
.collect(Collectors.toList());
}
}
上述代码中,我们通过Stream API的collect
方法,将原始集合list转化为一个Map,其中键是关键属性,值是对象本身。由于Map的键是唯一的,重复的对象会被自动去重。然后,我们使用values
方法获取Map的值视图,即去重后的对象集合。
使用示例:
class Book {
private String isbn;
private String title;
// getter and setter
}
List<Book> list = new ArrayList<>();
Book book1 = new Book("1234567890", "Java Programming");
Book book2 = new Book("9876543210", "Python Programming");
Book book3 = new Book("1234567890", "Java Programming"); // 与book1的isbn相同,应该被去重
list.add(book1);
list.add(book2);
list.add(book3);
List<Book> result = ObjectUtils.removeDuplicates(list, Book::getIsbn);
System.out.println(result); // 输出:[Book(isbn=