Scala入门学习笔记(一)

Posted by RussXia on July 13, 2019

Scala基础

Twitter提供的 Scala School

变量

定义不可变量:val, val类似于Java中的final变量。与之对应的var类似于Java中的非final变量。Scala自带类型推断(type inference),

scala> val a = 2
a: Int = 2

scala> var b = 3
b: Int = 3

scala> val str:String = "Hello World";
str: String = Hello World

scala> println(str);
Hello World

函数

Scala函数的基本构成 Scala 中的Unit类型类似于 Java 中 void 类型。而且实际上 Java 里 每一个返回 void 的方法都被映射为 Scala 里返回 Unit 的方法。

List和Tuple

Scala中的scala.List和Java中的java.util.List类是不一样,Scala中的List总是不可变的。(而 Java 的 List 可变 )。

Scala中,::是右操作数,1::twoThree是被twoThree调用,传入1。而类似*这样的是左操作数,a*b <=> a.*(b)

val twoThree = List(2, 3)
val oneTwoThree = 1 :: twoThree
//1 :: twoThree <=等价于=> twoThree.::(1)
val oneTwoThreeEquivalence = twoThree.::(1)
val pair = (99, "Luftballons")
println(pair._1)
println(pair._2)

Tuple和List一样,也是不可变的。针对一个元组(99, "Luftballons"),Scala推断元组类型为Tuple2[Int, String]。数据下标从1开始。

Set和Map

Scala中的trait类似于Java中的Interface。(尽管 Java 里面称为“实现”了接口,在 Scala 里面称为“扩展”或“混入”了特质。) Scala中的Set就有两种不同特质的实现:可变集和不可变集。 scala中的trait Scala 编译器推断 jetSet 的类型为不可变 Set[String]。因为不可变Set,每次+=都会产生一个新的 Set,所以jetSet无法用val修饰。

var jetSet = Set("Boeing", "Airbus")
jetSet += "Lear"
println(jetSet.contains("Cessna"))

如果想使用可变集,引入scala.collection.mutable即可。因为可变Set+=,是在原Set的基础上添加元素,所以可以用 val 修饰。

import scala.collection.mutable.Set
val movieSet = Set("Hitch", "Poltergeist")
movieSet += "Shrek"
println(movieSet)

Scala中的MapSet类似,提供了可变Map不可变Map两种。

val romanNumeral = Map(
    1 -> "I", 2 -> "II", 3 -> "III", 4 -> "IV", 5 -> "V"
)
println(romanNumeral(4))
import scala.collection.mutable.Map
val treasureMap = Map[Int, String]()
treasureMap += (1 -> "Go to island.")
treasureMap += (2 -> "Find big X on ground.")
treasureMap += (3 -> "Dig.")