2.1 条件表达式
Scala的if/else语法结构和Java一样,不同的是Scala的if/else表达式有值,这个值就是跟在if或者else后面表达式的值。
① val result = id (x >= 0) 1 else -1
② if (x >= 0) result = 1 else result = -1
通常都是采用第一种写法,因为变量可以定义为val,而第二种写法,则需要先将result声明为var。
在Scala中没有二元运算符的说法,像Java中的 ?:,x >= 0 ? 1 : -1,而在scala中需要表示这种结果的话,就只能像上面的第一种写法。
如果else部分缺失了,比如:if(x >= 0) 1,那么可能if语句没有输出值,但实际上Scala是有输出值的,只不过类型是Unit,这个相当于Java中void。
2.2 语句终止及块表达式
类似Java中的大括号{},当需要在逻辑分支或循环中执行多条语句时,就会用{}将代码包含起来,这就是表示语句块,在{}块中,最后一个表达式的值,就是整个{}块的值,这个非常适合初始化某个val时,需要执行多个语句才能完成的情况,例如:
val result = { val dx = x - x0; val dy = y - y0; sqrt(dx * dx + dy * dy) }
在这条语句中,使用了分号“;”,这个表示执行多条语句进行分隔,在scala语法当中,分号是可有可无的,主要是看个人编码习惯,如果不想在一条语句中放置分号,那么上述代码则变成如下形式:
val result = {
val dx = x - x0
val dy = y - y0
sqrt(dx * dx + dy * dy)
}
这两个语句实际上是等价的。
2.3 输入输出
Scala中的打印是非常简单的,Java中是用System.out.print或者println来进行输出,而在Scala中,则直接使用print或者println即可,并且也支持C风格的格式化字符串输出printf,例如:
scala> println("hello scala")
hello scala
scala> printf("hello, my name is %s\n, and my age is %d", "Kevin", 30)
hello, my name is Kevin
, and my age is 30
在Scala中,也可以用readLine函数从控制台读取输入的内容,如果读取数字、Boolean或者字符,可以用readInt、readDouble等方法,与其他方法不同,readLine带一个参数作为提示字符串:
val name = readLine("your name is :")
your name is :name: String = kevin
2.4 for循环
Scala的for循环与Java是有很大区别的,学过Java的都知道怎么使用for循环,例如:for(初始化变量;检查是否满足某个条件;更新变量),而在Scala中,是不存在这种方式,那Scala中的for循环是怎样的?
for (i < - 1 to 10)
r = r * i
其中 1to10 是表示1到10 的区间,而符号“<-“则表示遍历右边表达式的所有值,至于遍历如何执行,则取决于表达式的类型。
遍历字符串和数组时,通常使用从0 到 n-1 的区间,这个时候可以用until方法,而不是前面提到的to。
val hello = "helloworld" //> hello : String = helloworld
var s = 0 //> s : Int = 0
for (i <- 0 until hello.length) {
s += hello(i)
}
println(s) //> 1084
说明:在Scala中并没有break和continue来退出循环,那么在scala中想实现退出循环应该怎么做:
- 使用Boolean控制变量;
- 使用嵌套函数进行return
- 使用Breaks对象中的break方法:
import scala.util.control.Breaks._
breakable {
for (…) {
if(…) break; // 退出breakable块
}
}
第三种方式比较难理解,也比较容易出错,建议不使用。
2.5 for循环推导式
在for循环的循环体中,以yield开始,则该循环会构造出一个集合,每次迭代都会生成集合中的一个值,例如我们定义一个变量:
var nums = for (n <- 1 to 10) yield n * 10
//> nums : scala.collection.immutable.IndexedSeq[Int] = Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
nums的类型为 scala.collection.immutable.IndexedSeq[Int],值为Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
这类循环在scala中就被称作for推导式,它生成的集合与它的第一个生成器是类型兼容的。