Skip to content

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

上面这个例子太简单,使用 mapfor 看起来更清晰。

如果要处理一个复杂点的列表,比如 Seq(Seq(1), Seq(2, 3), Seq(4, 5, 6)),将所有元素 * 2,然后返回一个 List,包含所有处理后的元素,如果用 flatMapmap 则需要:

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 等;
Clone this wiki locally