Scala 的 for 推导式翻译

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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GettingReal

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值