【问题标题】:flatMap versus for expressionflatMap 与 for 表达式
【发布时间】:2013-10-16 16:29:13
【问题描述】:

在阅读了这篇关于 for 表达式的出色 answer 之后,我尝试将我的 flatMap 转换为 for-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))
}

我收到一个编译时错误,&lt;- 应该在 getId(...) 行上,但发现 }。

我的 for 表达式有什么问题?

【问题讨论】:

    标签: scala map


    【解决方案1】:

    您的理解需要将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)) 两者都没有,这是无效的。

    【讨论】:

    • 啊,所以yield 总是是必需的吗?在 map 到 for 表达式的情况下,yield 将返回一个 List[...]。但是对于一个flatMap到for-expression,yield会返回一个List[List[...]]?
    • yield 是必需的,如果你想得到一个值(而不是只是副作用)。我不确定你从哪里得到List[List[...]]。
    猜你喜欢
    • 1970-01-01
    • 2011-05-26
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    相关资源
    最近更新 更多