Scala 系列(三)—— 流程控制语句
一、条件表达式if
Scala 中的 if/else 语法结构与 Java 中的一样,唯一不同的是,Scala 中的 if 表达式是有返回值的。
object ScalaApp extends App {
val x = "scala"
val result = if (x.length == 5) "true" else "false"
print(result)
}
在 Java 中,每行语句都需要使用 ; 表示结束,但是在 Scala 中并不需要。除非你在单行语句中写了多行代码。
二、块表达式
在 Scala 中,可以使用 {} 块包含一系列表达式,块中最后一个表达式的值就是块的值。
object ScalaApp extends App {
val result = {
val a = 1 + 1; val b = 2 + 2; a + b
}
print(result)
}
// 输出: 6
如果块中的最后一个表达式没有返回值,则块的返回值是 Unit 类型。
scala> val result ={ val a = 1 + 1; val b = 2 + 2 }
result: Unit = ()
三、循环表达式while
Scala 和大多数语言一样,支持 while 和 do ... while 表达式。
object ScalaApp extends App {
var n = 0
while (n < 10) {
n += 1
println(n)
}
// 循环至少要执行一次
do {
println(n)
} while (n > 10)
}
四、循环表达式for
for 循环的基本使用如下:
object ScalaApp extends App {
// 1.基本使用 输出[1,9)
for (n <- 1 until 10) {print(n)}
// 2.使用多个表达式生成器 输出: 11 12 13 21 22 23 31 32 33
for (i <- 1 to 3; j <- 1 to 3) print(f"${10 * i + j}%3d")
// 3.使用带条件的表达式生成器 输出: 12 13 21 23 31 32
for (i <- 1 to 3; j <- 1 to 3 if i != j) print(f"${10 * i + j}%3d")
}
除了基本使用外,还可以使用 yield 关键字从 for 循环中产生 Vector,这称为 for 推导式。
scala> for (i <- 1 to 10) yield i * 6
res1: scala.collection.immutable.IndexedSeq[Int] = Vector(6, 12, 18, 24, 30, 36, 42, 48, 54, 60)
五、异常处理try
和 Java 中一样,支持 try...catch...finally 语句。
import java.io.{FileNotFoundException, FileReader}
object ScalaApp extends App {
try {
val reader = new FileReader("wordCount.txt")
} catch {
case ex: FileNotFoundException =>
ex.printStackTrace()
println("没有找到对应的文件!")
} finally {
println("finally 语句一定会被执行!")
}
}
这里需要注意的是因为 finally 语句一定会被执行,所以不要在该语句中返回值,否则返回值会被作为整个 try 语句的返回值,如下:
scala> def g():Int = try return 1 finally return 2
g: ()Int
// 方法 g() 总会返回 2
scala> g()
res3: Int = 2
六、条件选择表达式match
match 类似于 java 中的 switch 语句。
object ScalaApp extends App {
val elements = Array("A", "B", "C", "D", "E")
for (elem <- elements) {
elem match {
case "A" => println(10)
case "B" => println(20)
case "C" => println(30)
case _ => println(50)
}
}
}
但是与 Java 中的 switch 有以下三点不同:
- Scala 中的 case 语句支持任何类型;而 Java 中 case 语句仅支持整型、枚举和字符串常量;
- Scala 中每个分支语句后面不需要写 break,因为在 case 语句中 break 是隐含的,默认就有;
- 在 Scala 中 match 语句是有返回值的,而 Java 中 switch 语句是没有返回值的。如下:
object ScalaApp extends App {
val elements = Array("A", "B", "C", "D", "E")
for (elem <- elements) {
val score = elem match {
case "A" => 10
case "B" => 20
case "C" => 30
case _ => 50
}
print(elem + ":" + score + ";")
}
}
// 输出: A:10;B:20;C:30;D:50;E:50;
七、没有break和continue
额外注意一下:Scala 中并不支持 Java 中的 break 和 continue 关键字。
八、输入与输出
在 Scala 中可以使用 print、println、printf 打印输出,这与 Java 中是一样的。如果需要从控制台中获取输入,则可以使用 StdIn 中定义的各种方法。
val name = StdIn.readLine("Your name: ")
print("Your age: ")
val age = StdIn.readInt()
println(s"Hello, ${name}! Next year, you will be ${age + 1}.")
参考资料
- Martin Odersky . Scala 编程 (第 3 版)[M] . 电子工业出版社 . 2018-1-1
- 凯.S.霍斯特曼 . 快学 Scala(第 2 版)[M] . 电子工业出版社 . 2017-7
更多大数据系列文章可以参见 GitHub 开源项目: 大数据入门指南
Scala 系列(三)—— 流程控制语句的更多相关文章
- java与.net比较学习系列(5) 流程控制语句
java中流程控制语句主要分为以下几类,第一,条件语句,主要包括if语句和switch语句.第二,循环语句,主要包括while循环语句,for循环语句.第三,跳转语句,主要包括三种,break跳出语句 ...
- Sql Server系列:流程控制语句
T-SQL中用来编写流程控制模块的语句有:BEGIN...AND语句.IF...ELSE语句.CASE语句.WHILE语句.GOTO语句.BREAK语句.WAITFOR语句和RETURN语句. 1 B ...
- 自学Java第三章——《流程控制语句结构》
流程控制语句结构分为: 1.顺序结构:从上到下依次执行 2.分支结构:多个分支选择其中一个分支执行 3.循环结构:重复执行某些代码 3.1 顺序结构 执行过程:从上到下顺序执行 3.1.1 输出语句 ...
- awk系列:在awk中如何使用流程控制语句
导读 当你回顾所有到目前为止我们已经覆盖的 awk 实例,从 awk 系列的开始,你会注意到各种实例的所有指令是顺序执行的,即一个接一个地执行.但在某些情况下,我们可能希望基于一些条件进行文本过滤操作 ...
- Java基础三(Scanner键盘输入、Random随机数、流程控制语句)
1.引用类型变量的创建及使用2.流程控制语句之选择语句3.流程控制语句之循环语句4.循环高级 ###01创建引用类型变量公式 * A: 创建引用类型变量公式 * a: 我们要学的Scanner类是属于 ...
- 固本培元之三:Convert、运算符、流程控制语句、ref/out/in三种参数类型
一.Convert类常用的类型转换方法Convert.ToInt32() 转换为整型(int)Convert.ToChar() 转换为字符型(char)Convert.ToString() 转换为字符 ...
- Mysql高手系列 - 第18篇:mysql流程控制语句详解(高手进阶)
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 这是Mysql系列第18篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符 ...
- Java基础之路(三)下--流程控制语句
上次我们说了流程控制语句中的if语句,那本次就来聊聊switch语句. if else语句可以用来描述"二叉路口",而switch可用于"多叉路口"的情况. s ...
- java 第三章 流程控制语句
1.条件语句 (1)if 语句 ( 单一条件) if (表达式){ 执行语句块 } (2)执行流程 · if 语句 条件表达式可以是任何一种逻辑表达式 如果表达式值为true,则执行花括号的内容后 ...
- MYSQL进阶学习笔记三:MySQL流程控制语句!(视频序号:进阶_7-10)
知识点四:MySQL流程控制语句(7-10) 选择语句: (IF ELSE ELSE IF CASE 分支)IFNULL函数 IF语法: 语法规则: IF search_condition THEN ...
随机推荐
- zabbix-常规配置
zabbix server:cat zabbix_server.confLogFile=/data/log/zabbix_server.logLogFileSize=250DebugLevel=3Pi ...
- BERT模型
BERT模型是什么 BERT的全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder,因为de ...
- Seq2Seq模型 与 Attention 策略
Seq2Seq模型 传统的机器翻译的方法往往是基于单词与短语的统计,以及复杂的语法结构来完成的.基于序列的方式,可以看成两步,分别是 Encoder 与 Decoder,Encoder 阶段就是将输入 ...
- 站在BERT肩膀上的NLP新秀们(PART I)
站在BERT肩膀上的NLP新秀们(PART I)
- 为什么“四年一闰、百年不闰、四百年又闰”及 判断闰年的方法
小学数学学习方法: 为什么"四年一闰.百年不闰.四百年又闰"及判断平年和闰年的妙法 三年级的小朋友们都知道:我们公历年份是4的倍数的那一年一般都是闰年,但公历年份是100的倍数时, ...
- Self-Supervised Representation Learning
Self-Supervised Representation Learning 2019-11-11 21:12:14 This blog is copied from: https://lilia ...
- Metasploit使用内网跳板, 扫描局域网主机
最近,拿到一台内网机器, 苦于无法使用nmap扫描改主机的内网, 所以才有此文 在跳板机子获取一定权限后,需要积极的向内网主机权限发展,获取指定的目标信息,探查系统漏洞,借助msf已经得到的meter ...
- C#-关于TcpListener的AcceptTcpClient()方法造成线程阻塞,进而程序无法彻底关闭的问题
https://blog.csdn.net/nuistchn/article/details/50809158 在<C#高级编程>第7版第24章,有提到使用TCP类. 书中写了一个实例,两 ...
- Spring使用多个 <context:property-placeholder/>
Spring中报"Could not resolve placeholder"的解决方案(引入多个properties文件) 解决方案: (1) 在Spring 3.0中,可以写: ...
- java判断文件真实类型
代码如下: import java.io.FileInputStream; import java.io.IOException; import java.util.HashMap; /** * &l ...