史上最简单的Scala for推导教程
Scala 的 for 语法,本质上就是语法糖。并且十分简单,简单到简短的一篇文章,就可以说清楚。
Scala 中的 for 语句,都是帮你转换成类似 foreach、 map、 flatMap、 withFilter、 filter 之类的语法。并且整个转化过程是递归的,容易理解的。
看完下面是几个例子,你就能立马掌握。这几个例子,是结合了 Scala 官方的yield文档 改进过来的。
第一个例子,转换成 foreach
for(x <- c1) {...}
会被scalac翻译成
c1.foreach(x => {...})
注意,没有出现 yield 关键字。
再来一个:
for(x <- c1; y <- c2) {...}
会展开成:
c1.foreach(x => for(y <- c2) {...})
然后 scalac会再针对里面的 for 再进行转换,直到所有的 for 被转换完。
第二个例子,先 flatMap后 map
for(x <- c1) yield {...}
会被 scalac翻译成
c1.map(x => {...})
注意,这里出现了 yield关键字。
再来一个:
for(x <- c1; y <- c2) yield {...}
会展开成:
c1.flatMap(x => for(y <- c2) yield {...})
然后再展开成
c1.flatMap(x => c2.map( y => {...}))
注意这里多了一个 yield 关键字,所以会用 flatMap、 map 而不用 foreach。
并且,前面的都使用 forMap(比如 c1),最后面使用 map(比如 c2)。
好了,有无 yield的区别讲完了,这也是最重要的区别了,剩下的都很简单,而且不管有无 yield,概念都一样。
接着往下。
第三个例子,尝试 withFilter ,不行再 filter
for(x <- c; if cond) yield {...}
会翻译成
c.withFilter(x => cond).map(x => {...})
如果 c 没有 withFilter 方法,就使用 filter 方法:
c.filter(x => cond).map(x => {...})
第四个例子,加入其它值
for(x <- c; y = ...) yield {...}
会变成
c.map(x => (x, ...)).map((x,y) => {...})
结束
好了,scala 的 for 规则就结束了,就是这么简单。你肯定能记住。
