使⽤java8流(Stream)操作两个集合求并集,交集,补集⼀、基础的数据类型如String
两个集合
List<String> A =new ArrayList<>();
A.add("1");
A.add("2");
A.add("3");java stream
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().llectingAndThen(
()->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的map
ruleParams ->!pmParams.stream().Map(params -> RuleCode()+"-"+ ParamCode(), value -> value))
//判断该key是否存在
.RuleCode()+"-"+ ParamCode())
).List())
单属性的原理是把⼀个集合转化成⼀个完全由该属性组成的List,从⽽判断该属性是否存在,多条属性则是转成⼀个map,标准属性作为key,判断key存不存在
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论