1.scala数据类型

上表中列出的数据类型都是对象,也就是说scala没有java中的原生类型。在scala是可以对数字等基础类型调用方法的。例如数字1可以调方法,使用1.方法名。scala拥有和java一样的数据类型,和java的数据类型的内存布局完全一致,精度也完全一致。
Unit:表示没有返回值;
Nothing:表示没有值,是所有类型的子类型,创建一个类就一定有一个子类是Nothing;
Any:是所有类型的超类;
AnyRef:是所有引用类型的超类


如上两图所示,可见所有类型的基类是Any。Any之后分为两个AnyVal与AnyRef。其中AnyVal是所有数值类型的父类型,AnyRef是所有引用类型的父类型。
Scala还定义了底类型,其中Null类型是所有引用类型的底类型,所有AnyRef的类型的空值都是Null;而Nothing是所有类型的底类型和Any类型相对应,Null与Nothing都表示空。
String继承自AnyRef。与Java,Scala中的String也是内存不可变对象,及所有的字符串操作都会产生新的字符串。
Int等基础类型都是Scala包装的类型,例如Int类型对应的是Scala.Int只是Scala包会被每个源文件自动引用。
Option类型用来表示可能存在、也可能不存在的值。样例子类:Some("Fred")表示包装了某值。样例:None表示没有值。
2.声明与定义
常量声明
常量声明使用“val”值不可改变。
1val firstname : String = "wang" 2val lastname = "xiaoming" //可以省略类型
变量声明
变量声明使用“var”值可以改变。
1var name:String = "sean" 2var myname = "fengjia" //可以省略类型
函数声明
函数或者表达式的声明使用“def”
1object HelloScala { 2 3 def main(args: Array[String]): Unit = { 4 println(x) 5 println(y) 6 } 7 val a = 3 8 var b = 2 9 val x = a * b //定义常量名"x",会直接计算值 10 def y = a * b //这里只是定义表达式名字"y",不计算值 11 12}
3.字符串
注释
同java注释相同:单行注释“//”,多行注释“/* **/”
字符串
同java字符串。
多行字符串
scala中可以定义多行字符串
1 var str = 2 """ 3 hello 4 scala 5 """
s字符串
s字符串可以调用“变量/常量”,在字符串前面加s,在字符串中使用“$变量/常量名”的数学表达式,来调用变量。字符串之前不写s,则原样输出。
1 val name = "sean" 2 println(s"hello $name") 3 println("hello $name")
输出:
1hello sean 2hello $name
f字符串
在字符串前加f使用格式化变量功能。变量名后面加%s是表示字符串,变量名后面加%.2f是精确到百分位。
1 val name = "sean" 2 val height = 1.7 3 println(f"hello $name%s is $height%.2f") 4 println(s"hello $name%s") 5 println("hello $name%s is $height%.2f")
输出:
1hello sean is 1.70 2hello sean%s 3hello $name%s is $height%.2f
R字符串
在scala中如果要输出“\t”、“\n”等字符串时需要加转义符“\”否则会按照制表符或换行符输出。r字符串的使用是在字符串前面加raw,则可以将“\t”、“\n”等原样输出。
1 println("a\tb") 2 println(raw"a\tb")
输出:
1a b 2a\tb
4.Scala 函数
1.函数形式

函数简化形式
Scala中,可以不写return,如果不写return则自动将最后一行作为返回值,如果没有返回值,则函数的返回类型为Unit,类似于Java中void。
1 def max(x:Int,y:Int)={ 2 if (x>y) 3 x 4 else 5 y 6 }
这里还可以进一步把方法体的花括号也省略,所以函数可以进一步简化为
1 def min(x:Int,y:Int)= 2 if(x<y) 3 x 4 else 5 y
案例一(单个参数,参数设置初始值)
定义sayMyName方法,方法需要一个参数,类型是String,默认值是sean。如果使用参数则按照参数计算,如果不适用参数则使用默认值。
1object HelloScala2 { 2 3 def main(args: Array[String]): Unit = { 4 sayMyName() 5 sayMyName("jiafeng") 6 } 7 8 def sayMyName(name:String = "sean"): Unit ={ 9 println(name) 10 } 11 12}
案例二(可变参数)
多个相同类型的参数可以使用*表示,例如(k : Int*)表示多个Int类型的参数,具体数量不确定,类似于java中的可变参数。
1 def main(args: Array[String]): Unit = { 2 var sum = sumParam(1,2,3,4,5) 3 println(sum) 4 } 5 6 def sumParam(n : Int *) ={ 7 var sum = 0 8 for (i <- n){ 9 sum += i 10 } 11 sum 12 }
案例三(下划线做参数)
调用add方法使用下划线是一个符号表示一个变量名。
1 def main(args: Array[String]): Unit = { 2 var add = add2(5) 3 println(add) 4 } 5 6 def add(a : Int,b : Int) = a + b 7 def add2 = add(_ : Int,1)
2.递归调用
递归实际上就是方法自己调用自己,也可以称之为递归公式。
1 def main(args: Array[String]): Unit = { 2 var f = fact(9) 3 println(f) 4 } 5 6 def fact(n : Int) : Int = { 7 if(n <= 0){ 8 println("if:"+n) 9 1 10 }else{ 11 println("else:"+n) 12 n * fact(n - 1) 13 } 14 }
执行结果
1else:9 2else:8 3else:7 4else:6 5else:5 6else:4 7else:3 8else:2 9else:1 10if:0 11362880