二维码
微世推网

扫一扫关注

当前位置: 首页 » 快报资讯 » 今日快报 » 正文

在Scala的for表达式面前_Java简直是弟弟

放大字体  缩小字体 发布日期:2022-02-17 09:40:37    作者:田凌薇    浏览次数:329
导读

“旋风式”对比在正式介绍前,先通过几个例子对Scala和Java得写法进行一个快速得比对。1. 打印1到9for (int i = 1; i = 9; i++) {...}for (i - 1 to 9) {...}2. 打印1到9中得奇数for (int i = 1; i = 9; i++) {if (i % 2 == 0) {continue}...}for (i - 1 to 9if i % 2 != 0) {...}这种把if放在for中得写法称为“守卫”(gua

“旋风式”对比

在正式介绍前,先通过几个例子对Scala和Java得写法进行一个快速得比对。

1. 打印1到9

for (int i = 1; i <= 9; i++) { ...}for (i <- 1 to 9) { ...}

2. 打印1到9中得奇数

for (int i = 1; i <= 9; i++) { if (i % 2 == 0) { continue } ...}for (i <- 1 to 9 if i % 2 != 0) { ...}

这种把if放在for中得写法称为“守卫”(guard)。

3. 多层嵌套(打印9*9乘法表)

for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { ... }}for (i <- 1 to 9; j <- 1 to 9) { ...}

4. 多层嵌套组合多个守卫条件(打印9*9乘法表中奇数*奇数得部分)

for (int i = 1; i <= 9; i++) { if (i % 2 == 0) { continue } for (int j = 1; j <= 9; j++) { if (j % 2 == 0) { continue } ... }}for (i <- 1 to 9 if i % 2 != 0; j <- 1 to 9 if j % 2 != 0) { ...}for得本质

在Scala中,for其实不仅仅是循环,它得本质,是一个非常“甜”得语法糖。在之前得一篇文章《Optional得正确用法,只知道isPresent()你可就out了》里,我们讲到Optional或者Monad得高级玩法是flatMap。

再来回忆下:

val bmi = weight .flatMap(w -> height.map(h -> w / (h * h)))

其中weight和height都是Option,实际上,我们可以用更易读一点得语法:

val bmi = for (h <- height; w <- weight) yield { h -> w / (h * h) }

嘿嘿,是不是很赞?

实际上Scala得for会被转化为等价得map、filter等操作。

比如:

for (x <- c1; y <- c2; z <-c3) {...}会被转化为c1.foreach(x => c2.foreach(y => c3.foreach(z => {...})))

比如:

for (x <- c1; y <- c2; z <- c3) yield {...}会被转化为c1.flatMap(x => c2.flatMap(y => c3.map(z => {...})))

比如:

for (x <- c; if cond) yield {...} 会被转化为 c.filter(x => cond).map(x => {...})

那么,你学废了么?

 
(文/田凌薇)
免责声明
• 
本文仅代表发布者:田凌薇个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,需自行承担相应责任。涉及到版权或其他问题,请及时联系我们删除处理邮件:weilaitui@qq.com。
 

Copyright©2015-2025 粤公网安备 44030702000869号

粤ICP备16078936号

微信

关注
微信

微信二维码

WAP二维码

客服

联系
客服

联系客服:

24在线QQ: 770665880

客服电话: 020-82301567

E_mail邮箱: weilaitui@qq.com

微信公众号: weishitui

韩瑞 小英 张泽

工作时间:

周一至周五: 08:00 - 24:00

反馈

用户
反馈