持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
集合的逻辑操作
我们将学习两个集合之间的以下逻辑运算:
- OR:用于获取两个集合中元素的并集
- AND:用于获取两个集合中元素的交集
- XOR:用于从两个集合中查找不匹配的元素
- NOT:用于查找一个集合中不存在于第二个集合中的元素
OR - 两个集合的联合
两个List的并集,其中包含list1或list2或两者中的所有元素
| list1 | [1, 2, 4, 7] |
|---|---|
| list2 | [2, 4, 6, 8] |
| list1 OR list2 | [1, 2, 4, 7, 6, 8] |
我们可以通过使用Set来找到两个集合的并集
List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 4, 7));
List<Integer> list2 = new ArrayList<>(Arrays.asList(2, 4, 6, 8));
Set<Integer> set = new LinkedHashSet<>();
set.addAll(list1);
set.addAll(list2);
System.out.println(set);
这里我们首先将每个集合的所有元素添加到一个Set中,通过Set不包含任何重复元素的特性排除重复元素
使用LinkedHashSet来实现,保留结果集合中元素的顺序
AND - 两个集合的交集
两个集合的交集仅包含两个集合中的元素:
| list1 | [1, 2, 4, 7] |
|---|---|
| list2 | [2, 4, 6, 8] |
| list1 AND list2 | [2, 4] |
使用Java的Stream类来查找两个集合的交集:
List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 4, 7));
List<Integer> list2 = new ArrayList<>(Arrays.asList(2, 4, 6, 8));
List<Integer> intersectElements = list1
.stream()
.filter(list2 :: contains)
.collect(Collectors.toList());
if(!intersectElements.isEmpty()) {
System.out.println(intersectElements);
}else {
System.out.println(Collections.emptyList());
}
在list1上运行filter()方法来收集list2的匹配元素
XOR - 从两个集合中查找不同的元素
XOR(异或)是一种布尔逻辑运算,对于集合,XOR操作将取出只在一个集合中存在的元素:
| list1 | [1, 2, 4, 7] |
|---|---|
| list2 | [2, 4, 6, 8] |
| list1 XOR list2 | [1, 7, 6, 8] |
代码如下:
List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 4, 7));
List<Integer> list2 = new ArrayList<>(Arrays.asList(2, 4, 6, 8));
List<Integer> listOf1notIn2 = list1
.stream()
.filter(element->{
return !list2.contains(element);
})
.collect(Collectors.toList());
List<Integer> listOf2notIn1 = list2.stream().filter(element->{
return !list1.contains(element);
}).collect(Collectors.toList());
System.out.println(Stream.concat(listOf1notIn2.stream(),
listOf2notIn1.stream()).collect(Collectors.toList()));
这里我们首先使用Stream的filter()方法来取出仅存在与list1不存在于list2的元素。然后我们对list2执行同样的操作,最后拼接两个过滤后的List
NOT - 一个集合的元素不存在于第二个集合中
我们使用NOT()操作从一个集合中选择第二个集合中不存在的元素,如下例所示:
| list1 | [1, 2, 4, 7] |
|---|---|
| list2 | [2, 4, 6, 8] |
| list1 NOT list2 | [1, 7] |
| list2 NOT list1 | [6, 8] |
代码如下
List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 4, 7));
List<Integer> list2 = new ArrayList<>(Arrays.asList(2, 4, 6, 8));
List<Integer> notList = list1
.stream()
.filter(element->{
return !list2.contains(element);
})
.collect(Collectors.toList());
System.out.println( notList);
使用filter()方法过滤仅存在于list1不存在于list2中的元素\