You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:27:01