Scala 的 for 推导式翻译
for 推导式会提供 map、flatMap、withFilter 更好的语法糖,让程序逻辑更为直观
翻译单个生成器的 for 表达式
for (x <- expr1) yield expr2
Trans:
expr1.map(x => expr2)
翻译以一个生成器和一个过滤器开始的 for 表达式
for (x <- expr1 if expr2) yield expr3
Trans:
for (x <- expr1 withFilter(x => expr2)) yield expr3
Trans:
expr1 withFilter (x => expr2) map (x => expr3)
相同的翻译机制对于过滤器后面更多元素也同样适用。如果 seq 是一组任意的生成器、定义和过滤器的序列,那么
for (x <- expr1 if expr2; seq) yield expr3
Trans:
for (x <- expr1 withFilter expr2; seq) yield expr3
翻译以两个生成器开始的 for 表达式
for (x <- expr1; y <- expr2; seq) yield expr3
假定 seq 是一组任意的生成器、定义和过滤的序列
for (x <- expr1; y <- expr2; seq) yield expr3
Trans:
expr1.flatMap(x => for (y <- expr2; seq) yield expr3)
Trans:
expr1.flatMap(x => expr2.map(y => expr3))
翻译生成器中的模式
for ((x1, ..., xn) <- expr1) yield expr2
Trans:
expr1.map { case (x1, ..., xn) => expr2 }
当生成器左边的部分是一个任意的 pat 而不是单个变量或元组时
for (pat <- expr1) yield expr2
Trans:
expr1 withFilter {
case pat => true
case _ => false
} map {
case pat => expr2
}
翻译(for 表达式中的)定义
for (x <- expr1; y = expr2; seq) yield expr3
Trans:
for ((x, y) <- for (x <- expr1) yield (x, expr2); seq)
Trans:
expr1.flatMap(x => (x, expr2)).map((x, y) => expr3)
翻译 for 循环
for (x <- expr1) body
Trans:
expr1 foreach (x => body)
for (x <- expr1; if expr2; y <- expr3) body
Trans:
expr1 withFilter (x => expr2) foreach (x => expr3 foreach (y => body))
泛化 for 表达式
对于自己的数据类型,通过定义这四个方法来支持 for 表达式是完全可行的
abstract class C[A] {
def map[B](f: A => B): C[B]
def flatMap[B](f: A => C[B]): C[B]
def withFilter(p: A => Boolean): C[A]
def foreach(b: A => Unit): Unit
}