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

本文分享给需要面试刷题的朋友,整理了面试资料这份资料主要包含了Java基础,数据结构,jvm,多线程等等,由于篇幅有限,以下只展示小部分面试题, 需要完整版的朋友可以点一点领取:,获取码:

问题分析

现在有两个类:

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中引入了Stream和Lambda表达式,使用它们无需自己编写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=‘赵某’}]

最后

本文分享给需要面试刷题的朋友,整理了面试资料这份资料主要包含了Java基础,数据结构,jvm,多线程等等,由于篇幅有限,以下只展示小部分面试题, 需要完整版的朋友可以点一点领取:,获取码:

经验分享 程序员 微信小程序 职场和发展