Scala For Comprehensions和For循环

时间:2016-08-18 02:33:33

标签: scala collections

目的

尝试解密for comprehension and loop及其差异。

Expr1          ::=  `for' (`(' Enumerators `)' | `{' Enumerators `}')
                       {nl} [`yield'] Expr
Enumerators    ::=  Generator {semi Generator}
Generator      ::=  Pattern1 `<-' Expr {[semi] Guard | semi Pattern1 `=' Expr}
Guard          ::=  `if' PostfixExpr

问题

For loop

  

(enumsenums)的for循环ee为枚举器enumsenums生成的每个绑定执行表达式ee。

“执行表达式”意味着For循环不会产生值作为结果,只是对每个绑定应用一些操作,因此它基本上是 语句 (在我的理解,在Scala中,表达式返回一个值,但是一个语句不返回??

例如,下面将不会产生任何结果。

val mnemonic = Map('2' -> "ABC", '3' -> "DEF")
val a = for ((digit, str) <- mnemonic) str.contains(digit)

理解

  

为了理解(enumsenums),ee为枚举器枚举生成的每个绑定计算表达式ee并收集结果。

而对于理解,将通过收集评估每个绑定的 Expr 表达式的结果来生成集合对象。如果是这样,集合的类型是什么?如果它是一个方法,我可以查看API文档但是哪个文档指定了For comprehension返回的类型?

2 个答案:

答案 0 :(得分:2)

for循环为集合中的每个项执行语句:

for (x <- List(1,2,3)) {
  println(x)
}

将打印数字1,2和3.循环的返回类型是Unit,有点像void将是Java,所以它没有意义将它分配给任何东西。

使用关键字yield进行理解只是mapflatmap的语法糖。这两个陈述是等价的:

val y1 = for (x <- List(1,2,3)) yield x+1
val y2 = List(1,2,3).map(x => x+1)

答案 1 :(得分:1)

对于Scala中的理解,mapflatMapfilter的语法糖。它们返回的类型取决于您在理解中使用的集合类型,因此:

val result1: List[Int] = for (x <- List(1,2,3)) yield x
val result2: String = for (x <- "string") yield x
val result3: Future[Unit] = for (x <- futureReturningFunction()) yield x
相关问题