小编Rya*_*air的帖子

Scala for-comprehensions中的未来[选项]

我有两个返回期货的功能.我试图使用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)

scala future for-comprehension

34
推荐指数
3
解决办法
2万
查看次数

查找多列的第一个非空值

我试图在一组很多列中获取第一个非空值.我知道我可以使用每列的子查询来完成此操作.在性能的名称中,在这种情况下确实很重要,我想一次性完成这项工作.

以下示例数据为例:

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)

有谁知道解决方案?

sql sql-server

16
推荐指数
3
解决办法
2万
查看次数

标签 统计

for-comprehension ×1

future ×1

scala ×1

sql ×1

sql-server ×1