Scala基础语法

Scala基础语法

十月 25, 2019

Scala基础语法

变量

Scala定义了两种类型的变量val和var。val为常量,类似于js里面的const;而var即为变量。

比如定义一个字符串常量:

1
2
scala> val msg = "Hello,World"
msg:String = Hello,World

这个表达式定义了一个msg变量,为字符串常量。可以看到我们在定义这个常量时不需要定义其类型,Scala可以根据赋值的内容推算出类型。这在Scala语言中成为”type inference”(类型推断)。当然我们也可以指定类型,如:

1
2
scala> val msg2:String = "Hello again,world"
msg2: String = Hello again,world

不过这样写就不像Scala风格了。此外Scala语句也不需要以分号结尾。

函数

Scala既是面向对象的编程语言,也是面向函数的编程语言,因为函数在Scala语言中的地位和类是同等的。下面的代码定义了一个简单的函数求两个值的最大值:

1
2
3
4
5
6
scala> def max(x:Int,y:Int) : Int ={
| if (x >y) x
| else
| y
| }
max: (x: Int, y: Int)Int

每个Scala表达式都有返回结果,比如Scala的if else语句也是有返回值的,因此函数返回结果无需使用return语句,实际上在Scala代码中应当尽量避免使用return语句。函数的最后一个表达式的值就可以作为函数的结果进行返回。

While循环

下面的代码使用while实现一个循环:

1
2
3
4
5
6
val args = Array("I","like","scala")
var i=0
while (i < args.length) {
println (args(i))
i+=1
}

这里要注意的是Scala不支持++i和i++运算符,因此需要使用i+=1来加1。
Scala访问数组的语法是()而非[]。

使用foreach和for来实现迭代

1
args.foreach(arg => println(arg))

该表达式,调用args的foreach方法,传入一个参数,这个参数类型也是一个函数。这段代码可以再写的精简些,你可以利用Scala支持的缩写形式,如果一个函数只有一个参数并且只包含一个表达式,那么你无需明确指明参数。因此上面的代码可以写成:

1
args.foreach( println)

下面是for的例子:

1
2
for (arg <-args)
println(arg)

使用类型参数化数组

在Scala中,可以使用new来实例化一个类。 当你创建一个对象的实例时,你可以使用数值或者类型参数。

1
2
3
4
5
6
val greetStrings = new Array[String](3)
greetStrings(0)= "Hello"
greetStrings(1)= ","
greetStrings(2)= "world!\n"
for(i <- 0 to 2)
print(greetStrings(i))

或者另外一种初始化数组的简单办法:

1
val greetStrings =Array("Hello",",","World\n")

Lists

Scala也是一个面向函数的编程语言,面向函数的编程语言的一个特点是,调用某个方法不应该有任何副作用,参数一定,调用该方法后,返回一定的结果,而不会去修改程序的其他状态。 这样做的一个好处是方法和方法之间的关联性较小,从而方法变得更可靠和重要性高。使用这个原则也就意味着需要把变量设成不可修改的,这也就避免了多线程访问的互锁问题。
前面介绍的数组,它的元素是可以被修改的。如果需要使用不可以修改的序列,Scala中提供了Lists类。和Java的List不同,Scala的Lists对象是不可修改的。它被设计用来满足函数风格的代码。
比如下面的代码:

1
2
3
4
5
val oneTwo = List(1,2)
val threeFour = List(3,4)
val oneTwoThreeFour=oneTwo ::: threeFour
println (oneTwo + " and " + threeFour + " were not mutated.")
println ("Thus, " + oneTwoThreeFour + " is a new list")

定义了两个List对象。然后通过:::操作符(其实是:::方法)将两个列表连接起来。实际上由于List的不可修改特性,Scala创建了一个新的List对象oneTwoThreeFour来保存两个列表连接后的值。
List也提供了一个::方法来向List中添加一个元素,::为右操作符,也就是用::右边的对象来调用它的::方法,Scala中规定所有以:开头的操作符都是右操作符。
如下面使用常量创建一个列表:

1
2
val oneTwoThree = 1 :: 2 ::3 :: Nil
println(oneTwoThree)

元组

Scala中另外一个很有用的容器类为Tuples,和List不同的是,Tuples可以包含不同类型的数据,而List只能包含同类型的数据。Tuples在方法需要返回多个结果时非常有用。
一旦定义了一个元组,可以使用._和索引来访问元组的元素。

1
2
3
val pair=(99,"Luftballons")
println(pair._1)
println(pair._2)

目前Scala支持的元组的最大长度为22。如果有需要,你可以自己扩展更长的元组。

使用Sets和Maps

Scala Set是没有重复对象的集合,所有的元素都是唯一的。
Scala语言的一个设计目标是让程序员可以同时利用面向对象和面向函数的方法编写代码,因此它提供的集合类分成了可以修改的集合类和不可以修改的集合类量大类型。比如Array总是可以修改内容的,而List总是不可以修改内容的。类似的情况,Scala也提供了两种Sets和Maps集合类。