Scala 平面映射与表达式

Scala 平面映射与表达式,scala,map,Scala,Map,在阅读了这篇关于表达式的优秀文章之后,我尝试将我的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))) 然后,对表达式进行修改 val resu

在阅读了这篇关于表达式的优秀文章之后,我尝试将我的
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)))
然后,对表达式进行修改

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))
}
val结果:List[String]=foo()
def getId:List[String]=List((json\“\u id”).asOpt[String].getOrElse(“”)
val xs:List[String]=用于{

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

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

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

ah,所以总是需要
yield
?对于表达式的映射到,yield将返回一个列表[…]。但是对于表达式的平面映射到,yield将返回一个列表[List[…]?
yield
,如果您想要获取值,则需要(而不仅仅是副作用。)我不确定你从哪里得到的
List[List[…]]
x <- expr

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