2

在阅读了这个关于 for-expressions 的优秀答案后,我尝试将 my 转换flatMapfor-expression.

val results: List[String] = foo()
def getId: List[String] = List((json \ "_id").asOpt[String].getOrElse(""))
val xs: List[String] = results.flatMap( x => getId(Json.parse(x)))

然后是 for 表达式。

val results: List[String] = foo()
def getId: List[String] = List((json \ "_id").asOpt[String].getOrElse(""))
val xs: List[String] = for { 
    r <- result
    getId(Json.parse(r))
}

我得到一个<-预期的编译时错误getId(...),但发现}.

我的 for 表达有什么问题?

4

1 回答 1

2

您的理解需要将结果绑定getId到一个名称,并且yield

val xs: List[String] = for {
  r <- result
  x <- getId(Json.parse(r))
} yield x

for-comprehension 中的每一行都需要将一元计算的结果绑定到一个名称,使用

x <- expr

// or, `_ <- expr` to run `expr` purely for its effects and ignore the result

或者它需要是一个简单的任务,例如

x = expr

由于getId(Json.parse(r))单独两者都不做,这是无效的。

于 2013-10-16T16:37:31.377 回答