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=