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
上面的两种方式, 在数组内容是对象时, 需要特别注意:
- 使用2.1中的方法, 请务必重写equals
- 使用2.2的方法, 请务必重写equals和hashCode, 因为stream().distinct()会先用hashCode判断, 如果为true再调用equals