Java 8两个List取交集的实现方法
导言
在Java开发中,经常会遇到需要对两个List进行取交集的情况。Java 8引入了许多新的特性和函数式编程的概念,使得我们可以更加简洁和优雅地实现这个功能。本文将教会你如何使用Java 8来实现两个List的交集操作。
问题描述
假设我们有两个List,分别为list1和list2,它们包含了一些元素。我们需要找出这两个List中共同拥有的元素,并存储到一个新的List中。
解决方案
整个解决方案可以分为以下几个步骤:
步骤 | 描述 |
---|---|
1. | 创建两个List,分别为list1和list2 |
2. | 使用Java 8的新特性Stream,将两个List转换为Stream |
3. | 使用Stream的intersection方法取得两个Stream的交集 |
4. | 将交集的结果转换为List并返回 |
下面我们将详细介绍每个步骤需要做的事情,并给出相应的示例代码。
步骤1:创建两个List
首先,我们需要创建两个List对象,分别命名为list1和list2。这两个List可以包含任意元素,但需要保证它们具有一些共同的元素。
List<String> list1 = Arrays.asList("apple", "banana", "orange", "grape");
List<String> list2 = Arrays.asList("orange", "banana", "watermelon");
步骤2:转换为Stream
Java 8引入了Stream的概念,它可以用于对集合进行各种操作。我们可以使用List的stream()方法将List转换为Stream。
Stream<String> stream1 = list1.stream();
Stream<String> stream2 = list2.stream();
步骤3:取得交集
在Java 8中,Stream类提供了一个intersection方法,用于取得两个Stream的交集。我们可以使用该方法对步骤2中得到的两个Stream进行操作,得到它们的交集。
Stream<String> intersection = Stream.of(stream1, stream2)
.reduce((s1, s2) -> s1.filter(s2::contains))
.orElse(Stream.empty());
在上述代码中,我们首先使用Stream.of方法将stream1和stream2转换为一个包含两个Stream的Stream。然后,我们使用reduce方法对这两个Stream进行操作,传入一个lambda表达式作为参数。该lambda表达式用于过滤出两个Stream的交集。最后,我们使用orElse方法指定如果交集为空,则返回一个空的Stream。
步骤4:转换为List并返回
最后,我们需要将步骤3中得到的Stream转换为List,并将其作为方法的返回值。
List<String> result = intersection.collect(Collectors.toList());
return result;
在上述代码中,我们使用Stream的collect方法将交集的Stream转换为List,并使用Collectors.toList()方法指定转换后的类型为List。
示例代码
下面是完整的示例代码:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class ListIntersectionExample {
public static List<String> getIntersection(List<String> list1, List<String> list2) {
Stream<String> stream1 = list1.stream();
Stream<String> stream2 = list2.stream();
Stream<String> intersection = Stream.of(stream1, stream2)
.reduce((s1, s2) -> s1.filter(s2::contains))
.orElse(Stream.empty());
List<String> result = intersection.collect(Collectors.toList());
return result;
}
public static void main(String[] args) {
List<String> list1 = Arrays.asList("apple", "banana", "orange", "grape");
List<String> list2 = Arrays.asList("orange", "banana", "watermelon");
List<String> intersection = getIntersection(list1, list2);
System.out.println("交集:" + intersection);
}
}
运行上述示例代码,将输出交集的结果:
交集:[banana, orange]
结论
通过以上步骤,我们成功地使用Java 8实