Java8集合自定义去重

在开发过程中,我们经常会遇到需要对集合进行去重的情况,而Java8的Stream API为我们提供了一种简洁高效的方式来实现集合去重操作。本文将介绍如何利用Java8的Stream API对集合进行自定义去重操作,并给出代码示例。

Stream API简介

Java8引入了Stream API,它是对集合对象进行处理的工具。通过Stream API,我们可以实现对集合的过滤、映射、排序等操作,提高代码的可读性和简洁性。Stream API主要包括两种操作:中间操作和终结操作。中间操作用于对数据进行处理和转换,终结操作用于触发处理过程并获取最终结果。

自定义去重操作

在Java8中,我们可以通过Stream API的distinct()方法对集合进行去重。但是有时我们需要根据自定义规则进行去重,这时就需要自定义去重操作。下面是一个示例,演示了如何实现对集合进行自定义去重操作。

import java.util.ArrayList;
import java.util.List;

public class CustomDistinct {

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("orange");
        list.add("banana");
        list.add("apple");
        list.add("pear");

        list.stream()
                .distinct()
                .forEach(System.out::println);
    }
}

上面的代码展示了如何利用Stream API的distinct()方法对集合进行去重。在这个例子中,我们使用了一个简单的字符串集合,通过distinct()方法去除了重复元素,并通过forEach()方法输出去重后的结果。

自定义去重规则

有时候我们需要根据自定义规则对集合进行去重,比如根据对象的某个属性进行去重。下面是一个示例,演示了如何根据对象的某个属性进行去重操作。

import java.util.ArrayList;
import java.util.List;

public class CustomDistinct {

    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        list.add(new Person("Alice", 25));
        list.add(new Person("Bob", 30));
        list.add(new Person("Alice", 25));
        list.add(new Person("David", 35));

        list.stream()
                .filter(distinctByKey(Person::getName))
                .forEach(System.out::println);
    }

    static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        Map<Object, Boolean> seen = new ConcurrentHashMap<>();
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }

    static class Person {
        private String name;
        private int age;

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
}

上面的代码中,我们定义了一个Person类,包含姓名和年龄属性。通过distinctByKey()方法,我们可以根据Person对象的姓名属性进行去重操作。在forEach()方法中,通过传入distinctByKey(Person::getName)来指定去重规则,根据姓名属性进行去重处理。

总结

通过本文的介绍,我们了解了如何利用Java8的Stream API对集合进行自定义去重操作。首先我们讨论了Stream API的基本概念,然后给出了对集合进行去重的示例代码。接着,我们介绍了如何根据自定义规则对集合进行去重操作,并给出了根据对象属性进行去重的代码示例。通过这些示例,我们可以更好地利用Java8的Stream API进行集合去重操作,提高代码的简洁性和可读性。希望本文对你有所帮助,谢谢阅读!

关系图

erDiagram
    Person ||--o| name : string
    Person ||--o| age : int

参考资料

  1. [Java Stream API Guide](
  2. [Oracle Java Documentation](