Java Stream如何嵌套过滤,根据Object B属性筛选Object A集合
错误原因
Stream.filter()方法要求传入的断言函数必须返回boolean类型值,你写的内层代码a.getListOfB().stream().filter(b -> b.getId() == 10)返回的是Stream<B>类型,和要求的入参类型不匹配,因此抛出类型转换错误。
正确实现方案
你要实现的是「筛选出所有内部包含id=10的B对象的A对象」,直接使用Stream提供的anyMatch方法即可,该方法会判断流中是否存在任意一个元素满足给定条件,直接返回boolean值,完美适配外层filter的入参要求。
示例代码如下:
listOfObjectA = listOfObjectA.stream() .filter(a -> a.getListOfB().stream() // 只要有一个B对象的id=10,当前A对象就会被保留 .anyMatch(b -> b.getId() == 10) ) .collect(Collectors.toList());
如果你之前尝试用findAny没有成功,大概率是没有搭配isPresent()方法获取布尔值,这种写法也能实现需求,但是不如anyMatch简洁直观:
listOfObjectA = listOfObjectA.stream() .filter(a -> a.getListOfB().stream() .filter(b -> b.getId() == 10) .findAny() .isPresent() ) .collect(Collectors.toList());
扩展场景
如果后续有其他过滤需求,可以直接替换匹配方法:
- 保留「所有B对象都满足id=10」的A对象:替换
anyMatch为allMatch - 保留「所有B对象都不满足id=10」的A对象:替换
anyMatch为noneMatch
内容的提问来源于stack exchange,提问作者Kauls
相关产品推荐
相关产品推荐

