Scala for推导式中interestObj行报Cannot resolve symbol flatMap如何解决
Scala for推导式flatMap报错问题解决
问题复现代码
def pinShare(id: String, teamOpt: Option[String], expireTime: Long, interestOpt: Option[List[Interest]]): Future[Unit] = { for { teamObj <- teamOpt.map(team => teamRepository.getTeam(team)).getOrElse(Future.successful(None)) interestObj <- interestOpt.getOrElse(TR) // **says cannot resolve symbol flatmap here.** share <- shareRepository.findOneById(id).getOrFailWith(ShareNotFoundException) _ <- shareRepository.pinShare(share.id, teamObj, expireTime, interestObj) } yield { Future(postUpdateActions(id, None)) () }
错误原因分析
- Scala的for推导式本质是
flatMap/map的语法糖,要求同一个for代码块中所有<-右侧的表达式必须是相同的容器类型,你的代码中其余行返回的都是Future类型,因此所有行都必须返回Future才能匹配类型。 - 你当前
interestObj行的代码interestOpt.getOrElse(TR)的返回值类型是List[Interest](假设TR是预先定义的List[Interest]类型常量),并不是Future类型,和整个for推导式的容器类型不匹配,编译器无法找到对应Future的flatMap实现,因此抛出该错误。
解决方法
把这行的取值逻辑包装为立即完成的Future即可,修改后代码如下:
interestObj <- Future.successful(interestOpt.getOrElse(TR))
额外优化建议
你当前yield代码块中Future(postUpdateActions(id, None))属于额外创建了未被等待的异步任务,可能出现方法返回后该逻辑还未执行完成的时序问题,直接去掉外层Future包装即可:
} yield { postUpdateActions(id, None) () }
内容的提问来源于stack exchange,提问作者Hakan Apohan
相关产品推荐
相关产品推荐

