Java集合的常见操作(一)

348 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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中的元素\