Scala 是一种有趣的语言。它一方面吸取继承了多种语言中的优秀特性,一方面又没有抛弃 Java 这个强大的平台,它运行在 Java 虚拟机 (Java Virtual Machine) 之上,轻松实现和丰富的 Java 类库互联互通。它既支持面向对象的编程方式,又支持函数式编程。程序员
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 中约定俗成的编程习惯。大多数状况下分号都是可省的,若是你须要将两条语句写在同一行,则须要用分号分开它们。函数
函数的定义也很是简单,使用关键字 def
, 后跟函数名和参数列表,若是不是递归函数能够选择省略函数返回类型。Scala 还支持定义匿名函数,匿名函数由参数列表,箭头链接符和函数体组成。函数在 Scala 中属于一级对象,它能够做为参数传递给其余函数,能够做为另外一个函数的返回值,或者赋给一个变量。在下面的示例代码中,定义的匿名函数被赋给变量 cube
。匿名函数使用起来很是方便,好比 List
对象中的一些方法须要传入一个简单的函数做为参数,咱们固然能够定义一个函数,而后再传给 List
对象中的方法,但使用匿名函数,程序看上去更加简洁。spa
// 定义函数 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
语句,最后一条表达式的值会自动返回给函数的调用者。scala
和 Java 不一样,在 Scala 中,函数内部还能够定义其余函数。好比上面的程序中,若是用户只对 sum_of_square 函数感兴趣,则咱们能够将 square 函数定义为内部函数,实现细节的隐藏。code
def sum_of_square(x: Int, y: Int): Int = { def square(x: Int) = x * x square(x) + square(y) }
复杂一点的程序离不开流程控制语句,Scala 提供了用于条件判断的 if else
和表示循环的 while
。和 Java 中对应的条件判断语句不一样,Scala 中的 if else
是一个表达式,根据条件的不一样返回相应分支上的值。好比下面例子中求绝对值的程序,因为 Scala 中的 if else
是一个表达式,因此不用像 Java 那样显式使用 return
返回相应的值。对象
def abs(n: Int): Int = if (n > 0) n else -n
和 Java 同样,Scala 提供了用于循环的 while 语句,在下面的例子中,咱们将借助 while 循环为整数列表求和。继承
def sum(xs: List[Int]) = { var total = 0 var index = 0 while (index < xs.size) { total += xs(index) index += 1 } total }
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的赋值用了“<-”符号递归
区分大小写 - Scala是大小写敏感的,这意味着标识Hello 和 hello在Scala中会有不一样的含义。
类名 - 对于全部的类名的第一个字母要大写。
若是须要使用几个单词来构成一个类的名称,每一个单词的第一个字母要大写。
示例:class MyFirstScalaClass
方法名称 - 全部的方法名称的第一个字母用小写。
若是若干单词被用于构成方法的名称,则每一个单词的第一个字母应大写。
示例:def myMethodName()
程序文件名 - 程序文件的名称应该与对象名称彻底匹配。
保存文件时,应该保存它使用的对象名称(记住Scala是区分大小写),并追加“.scala”为文件扩展名。 (若是文件名和对象名称不匹配,程序将没法编译)。
示例: 假设“HelloWorld”是对象的名称。那么该文件应保存为'HelloWorld.scala“
def main(args: Array[String]) - Scala程序从main()方法开始处理,这是每个Scala程序的强制程序入口部分。