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

阅读: 评论:0

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

使用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().List());
System.out.println("并集:" + AuB);

输出结果:

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

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

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

交集:[3, 4]

3. 求差集
List<String> difference = A.stream().filter(s -> !B.contains(s)).List());
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().Collection(() -> new TreeSet<>(Comparatorparing(UserInfo::getUsername))), ArrayList::new
)).stream().sorted(Comparatorparing(UserInfo::getNumber)).List());
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).List()).Username())
).List());
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).List()).Username())
).List());
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的mapruleParams -> !pmParams.stream().Map(params -> RuleCode() + "-" + ParamCode(), value -> value))//判断该key是否存在.RuleCode() + "-" + ParamCode())
).List())

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

本文发布于:2024-02-08 19:51:38,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170739323068506.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:两个   操作   java   Stream
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23