Scala基础
一、Scala基本语法
1.1 Scala的数据类型
数值类型:Byte(8位有符号整数)、Short(16位有符号整数)、Int(32位有符号整数)、Long(64位有符号整数)、Float(32位单精度浮点数)、Double(64位双精度浮点数)。
字符类型:Char,代表单个16位Unicode字符。
字符串:String,用于存储文本。
布尔类型:Boolean,值为 true 或 false。
Unit表示无值,和其他语言中void等同,用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。
Null是所有AnyRef的子类,null是Null的唯一对象
Any是abstract类,它是Scala类继承结构中最底层的。所有运行环境中的Scala类都是直接或间接继承自Any这个类。
Nothing是所有类的子类,是一个类。Nothing没有对象,但是可以用来定义类型。
scala> def foo = throw new RuntimeException
foo: Nothing
AnyRef是所有引用类型的基类。
AnyVal 所有值类型的基类。
1.2 变量的定义
强类型语言:Java,需显式声明类型。
弱类型语言:JS、Scala,类型推断自动完成。
var 和 val : var 定义变量, val 定义常量(类似Java的 final )。
object VariableDefinitionExample extends App {
// 定义一个变量
var mutableVariable: Int = 10
println(s"Initial value of mutableVariable: $mutableVariable")
// 修改变量的值
mutableVariable = 20
println(s"Updated value of mutableVariable: $mutableVariable")
// 定义一个常量
val immutableVariable: String = "Hello Scala"
println(s"Value of immutableVariable: $immutableVariable")
1.3 操作符
算术操作符:如+、-、*、/、%等,以及&、|、^、>>、<<等。与Java相似。
特殊操作:如 ++ 、 -- Scala中不支持,需用 += 、 -= 替代。
比如num = 1,num ++是错误的,必须写做num += 1。
1.4 字符串的插值
三个字符串插值器:
s 在字符串前加可以直接使用变量
②f 除了不指定格式其他和s功能一样,使用%可以在变量后指定输出格式
③raw 除了字面值中的字符不做编码外其他功能和S插值器一样
scala> var name = "jeary"
name: String = jeary
scala> var src = s"hello${name}"
src: String = hellojeary
scala> val name1 = "jeary"
name1: String = jeary
scala> val name2 = "tom"
name2: String = tom
scala> println(s"hello,${name1 +","+name2}!")
hello,jeary,tom!
1.5 条件表达式
If、If Else(单分支):支持多分支条件表达式,每个表达式都有返回值、If else if else(多分支)
val x = 1
val y = if (x > 0) 1 else -1
println("y=" + y)
val z = if (x > 1) 1 else "error"
println("z=" + z)
val m = if (x > 2) 1
println("m=" + m)
val n = if (x > 2) 1 else ()
println("n=" + n)
scala> val y = if(1>1) 1 else "error"
y: Any = error
scala> val y = if(x>1) 1
y: AnyVal = ()
1.6 类型转换
类型转换:如 toInt 、 toDouble 等,支持字符串转数值类型。
val num = "11"
val num_int = num.toInt
println(num_int+22)
1.7循环语句
①for循环
For循环:支持 to 和 until ,用于遍历集合。
scala>for (i <- 1 to 10) println(i)
打印1到10
scala> 1 to 10
res6: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala>for (i <- 1 until 10) println(i)
打印1到9
//包含开头不包含结尾
scala> 1 until 10
res0: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)
遍历字符串:
相当于java中的fore
scala> val str = "hello"
str: String = hello
scala> for(c <- str) println(c)
h
e
l
l
o
通过下标遍历字符串:
scala> for (i <- 0 until str.length) println(str.charAt(i))
h
e
l
l
o
遍历数组:
scala> val arr = Array(1,2,3,4,5,6)
arr: Array[Int] = Array(1, 2, 3, 4, 5, 6)
scala> for(a <- arr) println(a)
1
2
3
4
5
6
通过下标遍历数组:
scala> for(i <- 0 until arr.length) println(arr(i))
1
2
3
4
5
6
双重循环:
输出个位数与十位数不相同的两位数(个位、十位数均从1-3取值)
scala> for(i <- 1 to 3;j <- 1 to 3 if i != j) println(i*10+j)
12
13
21
23
31
32
数组操作:
对数组中的每个数乘以10,生成一个新数组:
scala> val arr = Array(1,2,3,4,5,6)
arr: Array[Int] = Array(1, 2, 3, 4, 5, 6)
for(i<- arr)println(i*10)
for(i<- 0 until arr.length)println(arr(i)*10)
更简单的方法:
scala> for (i <- arr) yield i*10
res4: Array[Int] = Array(10, 20, 30, 40, 50, 60)
for 循环中的 yield 会把当前的元素记下来,保存在集合中,循环结束后将返回该集合。Scala 中 for 循环是有返回值的。如果被循环的是 Map,返回的就是Map,被循环的是 List,返回的就是 List,以此类推。
scala> arr.map(_ * 10)
res8: Array[Int] = Array(10, 20, 30, 40, 50, 60)
scala> arr.map(x => x *10)
res9: Array[Int] = Array(10, 20, 30, 40, 50, 60)
把数组中的偶数取出来乘以100得到一个新的数组
for(i<- arr if i%2 ==0)println(i*100)
for(i<- 0 until arr.length if arr(i)%2==0)println(arr(i)*100)
更简单的方法:
scala> for (i <- arr if i%2==0) yield i*100
res11: Array[Int] = Array(200, 400, 600)
scala> arr.filter(m => m%2==0).map(n => n*100)
res12: Array[Int] = Array(200, 400, 600)
②while循环
While和Do-While:与Java语法相似, do-while 至少执行一次。
var n = 10
while(n > 0) {
println(n)
n -= 1
}
③do while循环
至少被执行一次。
var n =1
do{
println(n)
n+=2
}while(n<10)
1.8操作符重载
在scala里面没有运算符,所有的符号其实都是方法。
scala> val a = 1.+(2)
a: Int = 3
相当于是,1这个实例调用+方法,传入了一个参数2
定义一个+方法:
scala> def +(x : Int,y : Int):Int = { x + y }
$plus: (x: Int, y: Int)Int
scala> $plus(10,30)
res8: Int = 40