如何在Future中实现条件执行SQL?现有代码报错求助
错误原因分析与正确实现
第一个代码报错原因
Scala里if是表达式,要求if和else分支返回相同类型。你的if块返回的是Future类型,但没写else分支,编译器没法推断统一的返回类型,所以报错。你觉得不需要else逻辑,但必须给一个符合类型要求的默认返回值来对齐类型。
第二个代码报错原因
Future.filter的作用是校验Future的结果是否满足断言:
- 满足条件:保留原Future结果,继续后续flatMap
- 不满足条件:直接抛出
NoSuchElementException(就是你看到的"Future.filter predicate is not satisfied"错误)
而你的需求是条件满足才执行后续SQL逻辑,不满足就跳过,不是让Future失败,所以filter完全不符合你的场景。另外你这里还写错了判断条件:把type != "fruits"写成了type != "ddl",这也是个逻辑错误。
正确实现方式
方式一:补全else分支,返回同类型空成功Future
if (type != "fruits" && !isFruits) { con.executeFuture(query).flatMap(_ => { conn.initQuery(query, isVegetables) if (isVegetables) { conn.VegetableCon.get.queryFuture(RunArgs) } else { conn.VegetableQueryCon.get.queryFuture(RunArgs) } }) } else { // 根据实际返回类型调整,比如如果后续返回Future[Result],就返回对应的默认Result Future.successful(()) }
方式二:提前判断条件,仅在满足时构建Future链
如果不想写else,也可以先判断条件,仅当条件满足时执行逻辑,否则直接返回默认Future:
val targetFuture = if (type != "fruits" && !isFruits) { con.executeFuture(query).flatMap(_ => { conn.initQuery(query, isVegetables) isVegetables match { case true => conn.VegetableCon.get.queryFuture(RunArgs) case false => conn.VegetableQueryCon.get.queryFuture(RunArgs) } }) } else { Future.successful(()) } // 后续使用targetFuture即可
内容的提问来源于stack exchange,提问作者JukeboxHero
相关产品推荐
相关产品推荐

