Scala 是一种有趣的语言。它一方面吸收继承了多种语言中的优秀特性,一方面又没有抛弃 Java 这个强大的平台,它运行在 Java 虚拟机 (Java Virtual Machine) 之上,轻松实现和丰富的 Java 类库互联互通。它既支持面向对象的编程方式,又支持函数式编程。
1,定义变量
val x = 0
var y = 1
y = 2
// 给常量赋值会出现编译错误
// x = 3
// 显式指定变量类型
val x1: Int = 0
var y1: Int = 0
仔细观察上述代码,我们会有两个发现:
定义变量时没有指定变量类型。这是否意味着 Scala 是和 Python 一样的动态类型语言呢?恰恰相反,Scala 是严格意义上的静态类型语言,由于其采用了先进的类型推断(Type Inference)技术,程序员不需要在写程序时显式指定类型,编译器会根据上下文推断出类型信息。比如变量 x
被赋值为 0,0 是一个整型,所以 x
的类型被推断出为整型。当然,Scala 语言也允许显示指定类型,如变量 x1
,y1
的定义。一般情况下,我们应尽量使用 Scala 提供的类型推断系统使代码看上去更加简洁。
另一个发现是程序语句结尾没有分号,这也是 Scala 中约定俗成的编程习惯。大多数情况下分号都是可省的,如果你需要将两条语句写在同一行,则需要用分号分开它们。
2,定义函数
函数的定义也非常简单,使用关键字 def
, 后跟函数名和参数列表,如果不是递归函数可以选择省略函数返回类型。Scala 还支持定义匿名函数,匿名函数由参数列表,箭头连接符和函数体组成。函数在 Scala 中属于一级对象,它可以作为参数传递给其他函数,可以作为另一个函数的返回值,或者赋给一个变量。在下面的示例代码中,定义的匿名函数被赋给变量 cube
。匿名函数使用起来非常方便,比如 List
对象中的一些方法需要传入一个简单的函数作为参数,我们当然可以定义一个函数,然后再传给 List
对象中的方法,但使用匿名函数,程序看上去更加简洁。
// 定义函数
def square(x: Int): Int =
x * x
// 如果不是递归函数,函数返回类型可省略
def sum_of_square(x: Int, y: Int) =
square(x) + square(y)
sum_of_square(2, 3)
// 定义匿名函数
val cube = (x: Int) => x * x *x
cube(3)
// 使用匿名函数,返回列表中的正数
List(-2, -1, 0, 1, 2, 3).filter(x => x > 0)
让我们再来和 Java 中对应的函数定义语法比较一下。首先,函数体没有像 Java 那样放在 {}
里。Scala 中的一条语句其实是一个表达式,函数的执行过程就是对函数体内的表达式的求值过程,最后一条表达式的值就是函数的返回值。如果函数体只包含一条表达式,则可以省略 {}
。其次,没有显示的 return
语句,最后一条表达式的值会自动返回给函数的调用者。
和 Java 不同,在 Scala 中,函数内部还可以定义其他函数。比如上面的程序中,如果用户只对 sum_of_square 函数感兴趣,则我们可以将 square 函数定义为内部函数,实现细节的隐藏。
def sum_of_square(x: Int, y: Int): Int = {
def square(x: Int) =
x * x
square(x) + square(y)
}
3,控制语句
复杂一点的程序离不开流程控制语句,Scala 提供了用于条件判断的 if else
和表示循环的 while
。和 Java 中对应的条件判断语句不同,Scala 中的 if else
是一个表达式,根据条件的不同返回相应分支上的值。比如下面例子中求绝对值的程序,由于 Scala 中的 if else
是一个表达式,所以不用像 Java 那样显式使用 return
返回相应的值。
3.1 使用 if else 表达式
def abs(n: Int): Int =
if (n > 0) n else -n
和 Java 一样,Scala 提供了用于循环的 while 语句,在下面的例子中,我们将借助 while 循环为整数列表求和。
3.2 使用 while 为列表求和
def sum(xs: List[Int]) = {
var total = 0
var index = 0
while (index < xs.size) {
total += xs(index)
index += 1
}
total
}
3.3 使用for循环
for(i <- 1 to 10)
{
println("i is " + i);
}
for(i <- 1 until 10)
{
println("i is " + i);
}
Scala语言中的for循环有两个关键字to和until。until和to的不同之处在于它不包括最后一个元素。上面代码中的第一个循环会循环打印1到10包括10,而第二个循环打印1到9,不包含10。另外,scala在for循环中对循环变量i的赋值用了“<-”符号
4,注意
区分大小写 - Scala是大小写敏感的,这意味着标识Hello 和 hello在Scala中会有不同的含义。
类名 - 对于所有的类名的第一个字母要大写。
如果需要使用几个单词来构成一个类的名称,每个单词的第一个字母要大写。
示例:class MyFirstScalaClass方法名称 - 所有的方法名称的第一个字母用小写。
如果若干单词被用于构成方法的名称,则每个单词的第一个字母应大写。
示例:def myMethodName()程序文件名 - 程序文件的名称应该与对象名称完全匹配。
保存文件时,应该保存它使用的对象名称(记住Scala是区分大小写),并追加“.scala”为文件扩展名。 (如果文件名和对象名称不匹配,程序将无法编译)。
示例: 假设“HelloWorld”是对象的名称。那么该文件应保存为'HelloWorld.scala“def main(args: Array[String]) - Scala程序从main()方法开始处理,这是每一个Scala程序的强制程序入口部分。