-
Notifications
You must be signed in to change notification settings - Fork 9
For Comprehensions(三)
Song Kun edited this page Feb 5, 2018
·
4 revisions
val xs = 1 :: 2 :: 3 :: Nil
,将每个元素 * 2,然后返回新列表,用 map
实现如下:
xs.map(_ * 2)
其中 map
可以用 for
解析替代,两者完全等价:
for {
x ← xs
} yield x * 2
上面这个例子太简单,使用 map
比 for
看起来更清晰。
如果要处理一个复杂点的列表,比如 Seq(Seq(1), Seq(2, 3), Seq(4, 5, 6))
,将所有元素 * 2,然后返回一个 List
,包含所有处理后的元素,如果用 flatMap
和 map
则需要:
xs.flatMap(_.map(_ * 2))
这个看起来就有点复杂了,一眼看去可能不好理解了,用 for
实现则:
for {
s ← xs
x ← s
} yield x * 2
这里,for
明显比 flatMap
+ map
清晰很多。
for
解析中可以插入中间结果:
for {
i ← 1 :: 2 :: Nil
square = i * i
} yield square * i
- 每次迭代,都会计算
square
,即square
会分别变成 1, 4 等;