Java使用Stream求对象集合的交集、差集详解

问题分析

现在有两个类:

class ClassA {
    String id;
    String realName;

    public ClassA(String id, String realName) {
        this.id = id;
        this.realName = realName;
    }

    @Override
    public String toString() {
        return "ClassA{" +
                "id='" + id + '\'' +
                ", realName='" + realName + '\'' +
                '}';
    }

    public String getId() {
        return id;
    }

    public String getRealName() {
        return realName;
    }
}

class ClassB {
    String id;
    String nickName;

    public ClassB(String id, String nickName) {
        this.id = id;
        this.nickName = nickName;
    }

    @Override
    public String toString() {
        return "ClassB{" +
                "id='" + id + '\'' +
                ", nickName='" + nickName + '\'' +
                '}';
    }

    public String getId() {
        return id;
    }

    public String getNickName() {
        return nickName;
    }
}

现在有两个集合,分别是ClassA对象的集合、ClassB对象的集合:

List<ClassA> aList = new ArrayList<>(Arrays.asList(
        new ClassA("1", "张三"),
        new ClassA("2", "李四"),
        new ClassA("3", "王五")
));
List<ClassB> bList = new ArrayList<>(Arrays.asList(
        new ClassB("2", "李某"),
        new ClassB("3", "王某"),
        new ClassB("4", "赵某")
));

现在要根据id求任意两个集合的交集、差集。

基本思想

基本思想就是想遍历第一个集合,取出第一个集合中的每个元素的某个属性,并使用这个属性遍历第二个集合,看这个属性是否在第二个集合中存在。相当于是有两层循环。
Java 8中引入了StreamLambda表达式,使用它们无需自己编写for循环,只需一行代码就能实现上述功能。

代码实现

求交集

//aList与bList的交集
List<ClassA> intersectA = aList
        .stream() //获取第一个集合的Stream1
        .filter(  //取出Stream1中符合条件的元素组成新的Stream2,lambda表达式1返回值为true时为符合条件
                a ->  //lambda表达式1,a为lambda表达式1的参数,是Stream1中的每个元素
                        bList.stream() //获取第二个集合的Stream3
                                .map(ClassB::getId) //将第二个集合每个元素的id属性取出来,映射成新的一个Stream4
                                .anyMatch( //返回值(boolean):Stream4中是否至少有一个元素使lambda表达式2返回值为true
                                        id -> //lambda表达式2,id为lambda表达式2的参数,是Stream4中的每个元素
                                                Objects.equals(a.getId(), id) //判断id的值是否相等
                                )
        )
        .collect(Collectors.toList()); //将Stream2转换为List
System.out.println(intersectA);

在这里插入图片描述
输出结果为:

[ClassA{id=‘2’, realName=‘李四’}, ClassA{id=‘3’, realName=‘王五’}]

求差集

//bList与aList的差集
List<ClassB> differenceB = bList.stream().filter(b -> aList.stream().map(ClassA::getId).noneMatch(id -> Objects.equals(b.getId(), id))).collect(Collectors.toList());
System.out.println(differenceB);

输出结果为:

[ClassB{id=‘4’, nickName=‘赵某’}]

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值