tonglin0325的个人主页

Scala学习笔记——内建控制结构

Scala的内建控制结构包括:if、while、for、try、match和函数调用

1.if表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
//常见的写法
var filename = "name"
if (!args.isEmpty)
filename = args(0)

//比较简洁的写法
var filename1 =
if (!args.isEmpty) args(0)
else "name"

//更简洁的写法,不要有中间变量
println(if(!args.isEmpty) args(0) else "name")

 

2.while循环,while循环和其他语言的一样,有while和do while

**  Scala中对再次赋值语句的返回值是Unit,比如下面这个例子**

 

3.for表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//列出当前目录的文件和文件夹
val filesHere = (new java.io.File(".")).listFiles

for (file <- filesHere)
println(file)

//打印1到4
for (i <- 1 to 4)
println(i)

//打印1到3
for (i <- 1 until 4)
println(i)

//for循环中的过滤功能
for (file <- filesHere if file.getName.endsWith("project"))
println(file)

//for循环中的过滤功能,多个条件用;号分隔
for (file <- filesHere
if file.isFile;
if file.getName.endsWith("sbt")
) println(file)

//嵌套枚举
for( a <- 1 to 3; b <- 1 to 3){
println( "Value of a: " + a );
println( "Value of b: " + b );
}

//for循环采用yield,可以从存储中返回for循环中的变量的值,输出List(1, 2, 4, 5, 6, 7)
val numList = List(1,2,3,4,5,6,7,8,9,10)
System.out.println(
for{
a <- numList if a != 3; if a < 8
}yield a
)

 

4.使用try表达式处理异常

   抛出异常

1
2
3
4
5
6
7
//抛出异常
def isEven(n : Int): Unit ={
val half =
if (n % 2 == 0) n / 2
else throw new RuntimeException("n必须是偶数")
}

   捕获异常,finally语句

1
2
3
4
5
6
7
8
9
10
11
12
  val file = new FileReader("input.txt")
try {
//使用文件
} catch {
//捕获异常
case ex: FileNotFoundException =>
case ex: IOException =>
} finally {
//确保文件关闭
file.close()
}

   catch子语句的返回值

1
2
3
4
5
6
7
8
//try-catch-finally语句的返回值
def urlFor(path:String) =
try{
new URL(path)
}catch{
case e:MalformedURIException => new URL("www.scala-lang.org")
}

  避免使用finally子句返回值

 

 

5.匹配(match)表达式

  Scala的match表达式类似于switch语句,其中 _ 表示其他的情况

  match表达式中的每一个备选项中break是隐含的,也就是不允许从一个备选项中落到下一个备选项中

1
2
3
4
5
6
7
8
9
//匹配表达式
val firstArg = if (args.length > 0) args(0) else ""
firstArg match {
case "1" => println("A")
case "2" => println("B")
case "3" => println("C")
case _ => println("D")
}

 

6.Scala中不再使用break和continue

可以用if替换每个continue,用布尔变量来替换每个break