-
Notifications
You must be signed in to change notification settings - Fork 9
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]
,其中E
为e
的类型
for
解析执行过程:
- 遍历
generator
中的所有元素 - 对于
generator
中的每个元素,调用yield
表达式 - 将所有
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
,事实上,任何 支持 withFilter
、map
和 flatMap
的类型都可以使用 for
表达式。