史上最简单的Scala for推导教程 (growthprogrammer.com)

【简介】

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 规则就结束了,就是这么简单。你肯定能记住。

点击查看原文 >>

@技术头条 2017-03-12 00:06 / 0个评论
赞过的人: @技术头条
要不要再学学下面的文章?
了解 Lua 的 for 循环 (linux.cn)
了解 for 循环结构和你在控制它时拥有的选项,这样你可以对如何在 Lua 中处理数据做出聪明的决定。

在编程中,迭代是一个重要的概念,因为代码通常必须多次扫描一组数据,以便它可以单独处理每个项目。控制结构使你能够根据通常在程序运行时动态建立的条件来指导程序的流程。不同的语言提供不同的控制,在Lua中,有while循环、for循环和repeat until循环。本文介绍for循环。
by @技术头条 2022-12-10 22:35 查看详情
提升 Docker Desktop For macOS 磁盘使用率 (soulteary.com)
本篇文章分享一些软件使用上的细节,以及如何提升磁盘利用率。
by @技术头条 2022-07-24 20:56 查看详情
用树莓派打造一个超薄魔镜的简单教程 (onevcat.com)
本来买了一个树莓派打算架个 Nextcloud,实际弄好以后发现并不是很用得上。眼看新买的树莓派就要沦为吃灰大军中的一员,实在不甘心。正好家里有一面穿衣镜,趁机改造一下,做成了一个 Magic Mirror。

有一些朋友好奇是怎么做到的,也会想要自己动手做一个类似的。这篇文章里我简单把这个镜子用到的材料、一些基本步骤和自己遇到的一些坑记录下来,通过说明整个过程,为大家提供参考。

这篇文章不会是一个手把手一步步教你做的教程。如果你也想要制作一个你自己的魔镜,最好是根据自己的情况和现实需要选取材料,这样会更贴合你自己的需求,也能让整个过程更有乐趣。
by @技术头条 2022-07-24 20:51 查看详情
IntelliJidea高效使用教程,一劳永逸! (mp.weixin.qq.com)
只要打出首字母就能联想出一整条语句,这也太智能了,还显示了每条语句使用频率。
原因是它学习了我的项目代码,总结出了我的代码偏好。
by @code小生 2022-05-08 23:44 查看详情
H5小程序直播教程,一看就会! (mp.weixin.qq.com)
大前端这几年算是一个热词,对于前段来说如果不是大前端,技术相对来说就已经算是落后了。如果还停留在对ES6,Vue这些基本技能的学习只能说处于一个及格线。

如果想做的卓越必须必备另一些大前端技能,比如说NodeJS,express.js, koaJs服务类,或者three.js这类3d数据图像,还有二维图像处理,比如d3,raphael, echart, 最后hls, flv视频行业。
by @code小生 2022-04-05 22:04 查看详情
从0搭建SpringCloud服务,完整教程! (mp.weixin.qq.com)
以前的服务器就好像,一个会语数外全能的老师,为学生提供服务,这个老师生病了,那全校停课。现在微服务流行后,学校有了数学教研组,语文教研组,外语教研组,每个教研组有一群老师具体负责某科的教学,缺了谁,学校都照样运转。
by @code小生 2022-03-13 23:27 查看详情
超详细的PyCharm教程,必须收藏! (mp.weixin.qq.com)
本文将使用 PyCharm Community Edition 2019.1 版本,该版本免费且可在所有主流平台上使用。只有最后一部分「PyCharm Professional 功能」使用的是 PyCharm Professional Edition 2019.1 版本。
by @code小生 2022-02-08 23:28 查看详情
微软再推Rust语言免费中文教程,更香了! (mp.weixin.qq.com)
在过去的几个月,Amazon、Facebook、微软以及谷歌等科技巨头正疯狂吸纳人才市场上的 Rust 语言程序员。Rust 人才的动向,也标志着该语言社区在发展进程中迎来了新的转折点。
by @code小生 2021-12-19 19:43 查看详情
手把手教程:实现王者荣耀自动刷金币 (mp.weixin.qq.com)
想写一个游戏的辅助脚本(或者外挂? )很久了。这几天工作、考试都完成的差不多了,闲下来写一个王者荣耀的刷金币脚本,供大家参考。
by @code小生 2021-10-18 21:25 查看详情
听说,ta写的for循环不用变量i (mp.weixin.qq.com)
非常神的一张图,大家还有什么文案,评论区打出来!
程序员才能懂的 22 张高度内涵图!!

程序员才懂的 1 首歌和 6 张图
by @code小生 2021-08-15 18:32 查看详情