Java对List数组进行去重

226 阅读1分钟

1 业务场景

以奥数班和英语班为例, 这两个班级内的学生存在重叠情况, 现在我需要统计全部参加课外班的学生,

逻辑上很简单, 但实际的代码却有很多种, 我们来讨论笔者认为最简单的两种方式

2 解决方案

假设我们有如下两个List:

List<Student> test1;
List<Student> test2;

2.1 contains

List中的contains方法可以判断是否包含目标对象, 直接上代码:

test2.forEach(student -> {
    if (!test1.contains(student)) {
        test1.add(student);
    }
})

2.2 stream

利用Java8后stream的新特性(讲道理我很喜欢)进行去重

为什么选择stream, 是因为当我们数组中的内容为对象时, List的contains方法

test1.addAll(test2);
result = test1.stream().distinct().collect(Collectors.toList());

2.3 重写equals和hashCode

上面的两种方式, 在数组内容是对象时, 需要特别注意:

  1. 使用2.1中的方法, 请务必重写equals
  2. 使用2.2的方法, 请务必重写equals和hashCode, 因为stream().distinct()会先用hashCode判断, 如果为true再调用equals