Skip to content

For Comprehensions(一)

Song Kun edited this page Feb 3, 2018 · 2 revisions

基本用法

for 表达式是 sequence comprehensions 的语法糖,语法格式如下:

for (enumerators) yield e
  • enumerators 是以 , 分隔的 enumerator 列表,enumerator 有两种类型:

    • generator(包含 <-
    • filter
  • 返回类型为 List[E],其中 Ee 的类型

for 解析执行过程:

  1. 遍历 generator 中的所有元素
  2. 对于 generator 中的每个元素,调用 yield 表达式
  3. 将所有 yield 表达式结果以 List 类型返回

下面的函数 f 计算 [0, n-1] 之间,和为 v 的所有数字组合:

def f(n: Int, v: Int): IndexedSeq[(Int, Int)] =
  for {
    i <- 0 until n
    j <- 0 until n if i + j == v && i <= j
  } yield (i, j)

f(100, 20) foreach {
  case (i, j) => println(s"i = $i, j = $j")
}
  • if i + j == v && i <= j 称为 guard,过滤作用

注意,若只关心 for 表达式的副作用,不需要返回值,则可省略 yield,此时 for 表达式返回类型为 Unit

def f(n: Int, v: Int): Unit =
  for {
    i <- 0 until n
    j <- 0 until n if i + j == v && i <= j
  } println(s"i = $i, j = $j")

f(100, 20)

适用类型

for 表达式不仅可用于 List,事实上,任何 支持 withFiltermapflatMap 的类型都可以使用 for 表达式。

Clone this wiki locally