网站首页 > 基础教程 正文
“旋风式”对比
在正式介绍前,先通过几个例子对Scala和Java的写法进行一个快速的比对。
1. 打印1到9
/* Java */
for (int i = 1; i <= 9; i++) {
...
}
/* Scala */
for (i <- 1 to 9) {
...
}
2. 打印1到9中的奇数
/* Java */
for (int i = 1; i <= 9; i++) {
if (i % 2 == 0) {
continue
}
...
}
/* Scala */
for (i <- 1 to 9
if i % 2 != 0) {
...
}
这种把if放在for中的写法称为“守卫”(guard)。
3. 多层嵌套(打印9*9乘法表)
/* Java */
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
...
}
}
/* Scala */
for (i <- 1 to 9;
j <- 1 to 9) {
...
}
4. 多层嵌套组合多个守卫条件(打印9*9乘法表中奇数*奇数的部分)
/* Java */
for (int i = 1; i <= 9; i++) {
if (i % 2 == 0) {
continue
}
for (int j = 1; j <= 9; j++) {
if (j % 2 == 0) {
continue
}
...
}
}
/* Scala */
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 => {...})
那么,你学废了么?
- 上一篇: 面试常客系列之跨域 java跨域面试题
- 下一篇: Scala运行脚本会启动程序 for循环
猜你喜欢
- 2024-10-12 Scala初学者入门指南!涵盖20多个基本技巧
- 2024-10-12 Scala循环性能问题,为了性能,你愿意牺牲代码的可维护性么?
- 2024-10-12 使用Apache Kafka时的7个错误 apache kafka实战pdf
- 2024-10-12 scala中为什么不建议用return scala for until
- 2024-10-12 scala——泛型方法、类、特质的使用,泛型边界、协变逆变非变
- 2024-10-12 程序员构建总是出问题,怎么办? 程序员构建总是出问题,怎么办呢
- 2024-10-12 scala——列表、元祖、列表相关知识
- 2024-10-12 scala语言基础图解-第一阶段(变量-条件-循环-方法-函数-集合)
- 2024-10-12 Scala入门视频已更新至88讲,后续还有大约20讲左右的视频就结束
- 2024-10-12 Scala快速入门 - 环境安装篇 scala安装步骤
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)