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,多线程等等,由于篇幅有限,以下只展示小部分面试题, 需要完整版的朋友可以点一点领取:,获取码:
下一篇:
简洁全面总结 R-安装卸载及加载卸除包