1. 概述

本文我们将学习如何使用Java 8 Stream,获取两个List的交集

2. 字符串List交集

下面我们创建了两个含有交集元素的 List<String>,且包含重复元素。

List<String> list = Arrays.asList("red", "blue", "blue", "green", "red");
List<String> otherList = Arrays.asList("red", "green", "green", "yellow");

利用Stream方法,我们可以轻松实现:

Set<String> result = list.stream()
  .distinct()
  .filter(otherList::contains)
  .collect(Collectors.toSet());

Set<String> commonElements = new HashSet(Arrays.asList("red", "green"));

Assert.assertEquals(commonElements, result);

首先,用 distinct 删除重复的元素。然后,我们使用 filter 筛选出同时包含在otherList中的元素。

最后,我们使用 Collector 转换输出。交集应该只包含每个共同的元素一次。顺序无关紧要,因此 toSet 是最直接的选择,但我们也可以使用 toList 或其他收集器方法。

更多学习 Java 8’s Collectors 使用指南.

3. 自定义类List求交集

如果List的元素类型不是String,而是我们自定义的Class如何实现呢?

此时我们只需要重写 equals 方法即可。

进一步了解 equals 方法,请学习 Java equals()hashCode()

4. 总结

本文我们学习了如何使用 Stream API 求两个List之间的交集。

示例中的代码存放在 GitHub.