Scala for推导式出现Future.filter断言不满足错误求助
问题分析与解决
你的代码触发Future.filter predicate is not satisfied错误的核心原因:
- 你在for推导式里的
if条件是对obj2Seq这个Future做过滤判断,只有当objects1.map(_.id)和objects2.map(_.relateObjId)**完全相等(包括元素顺序、数量)**时才会继续执行,一旦不满足这个严格的相等条件,Future就会直接失败抛出该错误。 - 但你的真实需求是筛选
Object2中relateObjId存在于objects1的id集合中的元素,和两个序列完全匹配的逻辑完全无关。
正确实现方式
先等待两个Future都拿到结果,再对objects2列表做业务筛选。为了提升查询效率,建议先把objects1的id转换成Set(集合查询时间复杂度为O(1),比序列的O(n)更高效):
val obj1Seq: Future[Seq[Object1]] = /* 调用返回Future[Seq[Object1]]的函数 */ val obj2Seq: Future[Seq[Object2]] = /* 调用返回Future[Seq[Object2]]的函数 */ for { objects1 <- obj1Seq objectIds = objects1.map(_.id).toSet objects2 <- obj2Seq } yield { objects2.filter(obj2 => objectIds.contains(obj2.relateObjId)) }
额外说明
- 不要用Future的filter处理业务数据筛选:Future的filter是用来判断Future的结果是否符合某个校验条件,不符合则让Future失败,这和业务上的列表筛选逻辑完全不同。
- 提前构建id集合:避免每次过滤都重复遍历
objects1的id序列,当objects1数据量较大时,能明显提升性能。
内容的提问来源于stack exchange,提问作者ahabrahante
相关产品推荐
相关产品推荐

