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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:42:04