在日常的开发工作中,我们经常会遇到需要对两个或多个List集合进行操作的需求,比如求两个列表的交集、并集、差集以及去重后的并集。这些操作在Java 8中变得非常简单,借助于流(Stream)API和集合类的新特性,我们可以轻松实现。下面将通过示例代码来展示如何使用Java 8来完成这些任务。
准备工作
首先,我们需要定义一个简单的Product类作为我们的数据模型:
java
深色版本
1public class Product {
2 private String name;
3 private double price;
4
5 // 构造函数
6 public Product(String name, double price) {
7 this.name = name;
8 this.price = price;
9 }
10
11 // Getter 和 Setter 方法
12 public String getName() {
13 return name;
14 }
15
16 public void setName(String name) {
17 this.name = name;
18 }
19
20 public double getPrice() {
21 return price;
22 }
23
24 public void setPrice(double price) {
25 this.price = price;
26 }
27
28 @Override
29 public boolean equals(Object o) {
30 if (this == o) return true;
31 if (o == null || getClass() != o.getClass()) return false;
32 Product product = (Product) o;
33 return Double.compare(product.price, price) == 0 &&
34 Objects.equals(name, product.name);
35 }
36
37 @Override
38 public int hashCode() {
39 return Objects.hash(name, price);
40 }
41
42 @Override
43 public String toString() {
44 return "Product{" +
45 "name='" + name + '\'' +
46 ", price=" + price +
47 '}';
48 }
49}
创建List集合
假设我们有两个List<Product>,分别表示不同的产品集合:
java
深色版本
1List<Product> list1 = Arrays.asList(
2 new Product("Apple", 1.0),
3 new Product("Banana", 0.5),
4 new Product("Cherry", 2.0)
5);
6
7List<Product> list2 = Arrays.asList(
8 new Product("Banana", 0.5),
9 new Product("Cherry", 2.0),
10 new Product("Durian", 3.0)
11);
求交集
要找出两个列表中的共同元素,可以使用stream()结合filter()方法,并且用collect(Collectors.toList())收集结果:
java
深色版本
1List<Product> intersection = list1.stream()
2 .filter(list2::contains)
3 .collect(Collectors.toList());
求并集
合并两个列表可以使用Stream.concat()方法:
java
深色版本
1List<Product> union = Stream.concat(list1.stream(), list2.stream())
2 .distinct() // 去重
3 .collect(Collectors.toList());
求差集
找出在第一个列表中但不在第二个列表中的元素:
java
深色版本
1List<Product> difference = list1.stream()
2 .filter(p -> !list2.contains(p))
3 .collect(Collectors.toList());
去重并集
如果想要得到两个列表的并集并且去除重复项,我们已经在并集的步骤中实现了这一点:
java
深色版本
1List<Product> distinctUnion = union; // 已经是去重的并集
结论
通过上述方法,我们可以很方便地在Java 8中处理集合的交集、并集、差集以及去重并集问题。这对于数据处理和逻辑实现提供了很大的便利。当然,在实际项目中,根据具体需求可能还需要考虑性能优化等问题。