获取两个list中相互不包含的部分

简介: 获取两个list中相互不包含的部分

走吧,去吃肉。”——《非正常死亡》


代码如下:提供了几种方法(自个写的)

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
class Scratch {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);
        List<Integer> list1 = new ArrayList<>();
        list1.add(1);
        list1.add(2);
        list1.add(3);
        list1.add(4);
        list1.add(8);
        list1.add(9);
        // 从list中过滤出list1不包含的
        List<Integer> reduce1 = list.stream().filter(item -> !list1.contains(item)).collect(Collectors.toList());
        // 从list1中过滤出list不包含的
        List<Integer> collect = list1.stream().filter(item -> !list.contains(item)).collect(Collectors.toList());
        // 连接起来
        reduce1.addAll(collect);
        // 预期结果[5,6,8,9]
        List<Integer> result = Stream.concat(list.stream().filter(item -> !list1.contains(item)), list1.stream().filter(item -> !list.contains(item))).collect(Collectors.toList());
        System.out.println(result);
    }
    public static List<Integer> subListRemoveAll(List<Integer> list1, List<Integer> list2) {
        List<Integer> list = new ArrayList<>(list1);
        list1.removeAll(list2);
        list2.removeAll(list);
        list1.addAll(list2);
        return list1;
    }
    public static List<Integer> subListRetainAll(List<Integer> list1, List<Integer> list2) {
        List<Integer> list = new ArrayList<>(list1);
        list.retainAll(list2);
        list1.addAll(list2);
        list1.removeAll(list);
        return list1;
    }
    public static List<Integer> subListStream(List<Integer> list1, List<Integer> list2) {
        return Stream.concat(list1.stream(), list2.stream()).filter(i -> !list1.contains(i) || !list2.contains(i)).collect(Collectors.toList());
    }
    public static List<Integer> subListCollect(List<Integer> list1, List<Integer> list2) {
        return Stream.concat(list1.stream(), list2.stream()).collect(ArrayList::new, (l, v) -> Optional.of(!list1.contains(v) || !list2.contains(v)).filter(i -> i).ifPresent(p -> l.add(v)), ArrayList::addAll);
    }
    public static List<Integer> subListPartitioningBy(List<Integer> list1, List<Integer> list2) {
        return Stream.concat(list1.stream(), list2.stream()).collect(Collectors.partitioningBy(v -> !list1.contains(v) || !list2.contains(v))).getOrDefault(true, Collections.emptyList());
    }
}


相关文章
|
Java
Java 对象间关系(依赖、关联、聚合和组合)
面向对象设计 对象间关系:依赖、关联、聚合和组合,四种关系容易混淆。特别后三种,只是在语义上有所区别,所谓语义就是指上下文环境、特定情景等。 
502 1
|
1月前
|
Python
通过 type 和 object 之间的关联,进一步分析类型对象
通过 type 和 object 之间的关联,进一步分析类型对象
56 3
|
3月前
|
XML Java API
List与String相互转化方法汇总
本文汇总了List与String相互转化的多种方法,包括使用`String.join()`、`StringBuilder`、Java 8的Stream API、Apache Commons Lang3的`StringUtils.join()`以及Guava的`Joiner.on()`方法实现List转String;同时介绍了使用`split()`方法、正则表达式、Apache Commons Lang3的`StringUtils.split()`及Guava的`Splitter.on()`方法实现String转List。
110 1
List与String相互转化方法汇总
|
6月前
如何实现数组和 List 之间的转换?
如何实现数组和 List 之间的转换?
|
3月前
|
存储 Python
set() 和 freezeset() 之间有什么区别?
【8月更文挑战第29天】
31 6
|
4月前
|
XML Java API
List与String相互转化的方法有哪些
摘要:本文概述了Java中List转换为String及反之的多种策略。使用`String.join()`可简洁地连接List元素;`StringBuilder`提供灵活控制;Java 8 Stream API收集器简化操作;Apache Commons Lang3的`StringUtils.join()`和Guava的`Joiner.on()`支持外部库的高效转换。
|
5月前
|
索引
foreach、for in和for of之间区别?
foreach、for in和for of之间区别?
225 0
|
6月前
|
JavaScript 前端开发 索引
foreach、for in 和for of之间的区别
foreach、for in 和for of之间的区别
55 6
|
安全
RxSwift特征序列Driver的使用,以及共享附加作用与非共享附加作用的区别?
RxSwift特征序列Driver的使用,以及共享附加作用与非共享附加作用的区别?
175 0
|
存储 BI 数据库
access各对象之间的关系
access各对象之间的关系