使用java 8 流(Stream)操作两个集合求并集,交集,补集

一、基础的数据类型 如String

两个集合
List<String> A = new ArrayList<>();
A.add("1");
A.add("2");
A.add("3");
A.add("4");
List<String> B = new ArrayList<>();
B.add("3");
B.add("4");
B.add("5");
B.add("6");
B.add("7");
1. 求并集
A.addAll(B);
List<String> AuB = A.stream().distinct().collect(Collectors.toList());
System.out.println("并集:" + AuB);

输出结果:

并集:[1, 2, 3, 4, 5, 6, 7]

2. 求交集
List<String> AnB = A.stream().filter(B::contains).collect(Collectors.toList());
System.out.println("交集:" + AnB);

注:B::contains = s -> B.contains(s) 高版本IDEA会提示转换
输出结果

交集:[3, 4]

3. 求差集
List<String> difference = A.stream().filter(s -> !B.contains(s)).collect(Collectors.toList());
System.out.println("A中B的补集:" + difference);

注:差集:A - B;学名就叫做 A中B的补集
输出结果

A中B的补集:[1, 2]

二、自定义的类型(以单条属性为标准)

求交集并集是以username为标准

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class UserInfo {
    private String username;
    private Integer age;
}
两个集合
List<UserInfo> A = new ArrayList<>();
A.add(new UserInfo("赵", 1));
A.add(new UserInfo("杜", 2));

List<UserInfo> B = new ArrayList<>();
B.add(new UserInfo("杜", 2));
B.add(new UserInfo("周", 3));
1. 求并集
// 求并集
A.addAll(B);
// 获取两集合相加并根据username去重后的集合,并按照number进行排序
List<UserInfo> AuB = A.stream().collect(Collectors.collectingAndThen(
        Collectors.toCollection(
                () -> new TreeSet<>(
                        Comparator.comparing(UserInfo::getUsername)
                )
        ), ArrayList::new
)).stream().sorted(Comparator.comparing(UserInfo::getNumber)).collect(Collectors.toList());
System.out.println("并集:");
AuB.forEach(System.out::println);

输出结果:

并集:
UserInfo(username=赵, number=1)
UserInfo(username=杜, number=2)
UserInfo(username=周, number=3)

2. 求交集
// 求交集
List<UserInfo> AnB = A.stream().filter(userInfo ->
        B.stream().map(UserInfo::getUsername).collect(Collectors.toList()).contains(userInfo.getUsername())
).collect(Collectors.toList());
System.out.println("交集:");
AnB.forEach(System.out::println);

输出结果

交集:
UserInfo(username=杜, number=2)

3. 求差集
// 求差集
List<UserInfo> difference = A.stream().filter(userInfo ->
        !B.stream().map(UserInfo::getUsername).collect(Collectors.toList()).contains(userInfo.getUsername())
).collect(Collectors.toList());
System.out.println("A中B的补集:");
difference.forEach(System.out::println);

注:差集:A - B;学名就叫做 A中B的补集
输出结果

A中B的补集:
UserInfo(username=赵, number=1)

二、自定义的类型(以多条属性为标准)

求差集
// 大集合
List<PmRuleConfigParams> prpallParams = new ArrayList<>();
// 小集合
List<PmRuleConfigParams> pmParams = new ArrayList<>();
// 求差集
List<PmRuleConfigParams> dif = prpallParams.stream.filter(
		//把集合转成以ruleCode-paramCode为key的map
		ruleParams -> !pmParams.stream().collect(Collectors.toMap(params -> params.getRuleCode() + "-" + params.getParamCode(), value -> value))
				//判断该key是否存在
				.containsKey(ruleParams.getRuleCode() + "-" + ruleParams.getParamCode())
).collect(Collectors.toList())

单属性的原理是把一个集合转化成一个完全由该属性组成的List,从而判断该属性是否存在,多条属性则是转成一个map,标准属性作为key,判断key存不存在

Java 8 中可以使用 Stream API 来实现集合之间的交集差集、去重。 假设有两个 List 集合list1 list2,分别包含一些元素,代码如下: ```java List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5); List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8); ``` 下面分别介绍如何实现集合之间的操作。 1. 取交集交集即获取两个集合中共同拥有的元素。可以使用 Stream API 的 `filter()` 方法 `contains()` 方法实现。代码如下: ```java List<Integer> intersection = list1.stream() .filter(list2::contains) .collect(Collectors.toList()); System.out.println("交集:" + intersection); // 输出 [4, 5] ``` 2. 取即获取两个集合中所有的元素,但是去重。可以使用 Stream API 的 `distinct()` 方法 `concat()` 方法实现。代码如下: ```java List<Integer> union = Stream.concat(list1.stream(), list2.stream()) .distinct() .collect(Collectors.toList()); System.out.println(":" + union); // 输出 [1, 2, 3, 4, 5, 6, 7, 8] ``` 3. 取差集差集即获取两个集合中不同的元素。可以使用 Stream API 的 `filter()` 方法 `!contains()` 方法实现。代码如下: ```java List<Integer> diff1 = list1.stream() .filter(e -> !list2.contains(e)) .collect(Collectors.toList()); System.out.println("差集1:" + diff1); // 输出 [1, 2, 3] List<Integer> diff2 = list2.stream() .filter(e -> !list1.contains(e)) .collect(Collectors.toList()); System.out.println("差集2:" + diff2); // 输出 [6, 7, 8] ``` 4. 去重 去重即获取两个集合中所有的元素,且去重。可以使用 Stream API 的 `distinct()` 方法 `flatMap()` 方法实现。代码如下: ```java List<Integer> distinctUnion = Stream.of(list1, list2) .flatMap(List::stream) .distinct() .collect(Collectors.toList()); System.out.println("去重:" + distinctUnion); // 输出 [1, 2, 3, 4, 5, 6, 7, 8] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值