我有两个返回期货的功能.我试图使用for-yield理解将第一个函数的修改结果输入到另一个函数中.
这种方法有效:
  val schoolFuture = for {
    ud <- userStore.getUserDetails(user.userId)
    sid = ud.right.toOption.flatMap(_.schoolId)
    s <- schoolStore.getSchool(sid.get) if sid.isDefined
  } yield s
Run Code Online (Sandbox Code Playgroud)
但是我对那里的"if"感到不满意,似乎我应该可以使用地图了.
但是当我尝试使用地图时:
  val schoolFuture: Future[Option[School]] = for {
    ud <- userStore.getUserDetails(user.userId)
    sid = ud.right.toOption.flatMap(_.schoolId)
    s <- sid.map(schoolStore.getSchool(_))
  } yield s
Run Code Online (Sandbox Code Playgroud)
我收到编译错误:
[error]  found   : Option[scala.concurrent.Future[Option[School]]]
[error]  required: scala.concurrent.Future[Option[School]]
[error]         s <- sid.map(schoolStore.getSchool(_))
Run Code Online (Sandbox Code Playgroud)
我玩了几个变种,但没有找到任何有吸引力的工作.任何人都可以提出更好的理解和/或解释我的第二个例子有什么问题吗?
这是Scala 2.10的一个最小但完整的可运行示例:
import concurrent.{Future, Promise}
case class User(userId: Int)
case class UserDetails(userId: Int, schoolId: Option[Int])
case class School(schoolId: Int, name: String)
trait Error
class UserStore { …Run Code Online (Sandbox Code Playgroud) 我试图在一组很多列中获取第一个非空值.我知道我可以使用每列的子查询来完成此操作.在性能的名称中,在这种情况下确实很重要,我想一次性完成这项工作.
以下示例数据为例:
col1     col2     col3     sortCol
====================================
NULL     4        8        1
1        NULL     0        2
5        7        NULL     3
Run Code Online (Sandbox Code Playgroud)
我的梦想查询会在每个数据列中找到第一个非空值,按照排序sortCol.
例如,在选择前三列的魔法聚合时,按sortCol降序排序.
col1     col2     col3
========================
5        7         0
Run Code Online (Sandbox Code Playgroud)
或者在升序排序时:
col1     col2     col3
========================
1        4         8
Run Code Online (Sandbox Code Playgroud)
有谁知道解决方案?