ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] # 变量定义 ## val 可以不声明类型,scala自动推断类型 ~~~ val a = "123"; ~~~ 也可以直接声明类型 ~~~ val b: String = "123"; ~~~ **注意: val声明的变量,声明好了之后,值是不可变的,相当于final修饰了,但是可以用val重新赋值** ~~~ scala> val k = "123" k: String = 123 scala> k = "234" <console>:12: error: reassignment to val k = "234" ^ scala> val k = "234" k: String = 234 ~~~ 推荐用val,方便垃圾回收 ## var 和val相比,var是可以重新赋值的 # 常用类型 scala和java一样,有7种数值类型Byte, Char, Short, Int, Long, Float和Double(无包装类型)和一个Boolean类型 # 循环 **注意:scala没有++这个操作符** ~~~ scala> val s = "hello123"; s: String = hello123 scala> for (c <- s) println(c) ~~~ for里面的就是把s遍历出来的元素赋值给c **表达式1-10循环** ~~~ for (i <- 1 to 10) println(i) ~~~ **循环数组** ~~~ # val arr = Array[String]("a", "b", "c") val arr = Array("a", "b", "c") for (i <- arr) println(i) ~~~ **高级循环** 每个生成器都可以带一个条件,注意: if前面没有分号 ~~~ scala> for (i <- 1 to 3; j<- 1 to 3 if i != j) | println(i + "---" + j) ~~~ **for推导式** 如果for循环的循环体以yield开始,则该循环会构建出一个集合 每次迭代生成集合中的一个值 ~~~ val v = for (i <- 1 to 10) yield i * 10 println(v) Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100) ~~~ **util包左不包右** ~~~ val a = Array("a", "b", "c") for(i <- 0 util a.length) println(a(i)) ~~~ ## while循环中断 ~~~ import scala.util.control.Breaks val loop = new Breaks var n = 1 loop.breakable{ while(n<=20) { n+=1; println(n) if(n == 18) { loop.break() } } } ~~~ **多重while循环** ~~~ import scala.util.control.Breaks val loop1 = new Breaks val loop2 = new Breaks var count = 1 loop1.breakable { while (true) { count += 1 println(count) if (count == 10) { loop1.break() } loop2.breakable { while (true) { println(count) count += 1 if (count == 20) { loop2.break() } } } } } ~~~ # 判断 **支持混合类型的表达式** ~~~ scala> val x = 1 x: Int = 1 scala> val z = if(x>1) 1 else "error" z: Any = error ~~~ **可以缺失else** 如果缺失else,相当于`if (x>2) 1 else ()` ~~~ scala> val m = if (x>2) 1 m: AnyVal = () ~~~ # 块表达式 ~~~ scala> val x = 0 x: Int = 0 scala> val result = { | if(x>0) { | -1 | } else if(x>=1) { | 1 | } else { | "error" | } | } result: Any = error ~~~ # 操作符重载 ![](images/screenshot_1543978894433.png) ~~~ a+b ~~~ 是如下方法调用的简写 ~~~ a.+(b) ~~~ a方法b可以写成`a.方法(b)` # 方法 ~~~ scala> def m(x:Int) : Int = x*x m: (x: Int)Int scala> m(4) res0: Int = 16 ~~~ 可以把返回值类型去掉 ~~~ def m(x:Int) : x*x ~~~ 可以返回空 ~~~ scala> def n (y:Int, z:Int) : Unit = println(y+z) n: (y: Int, z: Int)Unit scala> val a = n(1,3) 4 a: Unit = () ~~~ 还可以这样写 ~~~ scala> def n(y: Int, z: Int) { | println(y+z) | } n: (y: Int, z: Int)Unit ~~~ # 类型 ![](https://box.kancloud.cn/fd4a1f7d7baf43a8c59492b09208b1a4_1212x814.png) AnyVal表示值类型 AnyRef表示引用类型 scala中,所有的值都是类对象,而所有的类,包括值类型,都最终继承自一个统一的根类型Any. 统一类型,是scala的一个特点,scala还定义了几个底层类(Bottom Class),比如Null和Nothing 1. Null是所有引用类型的子类型,而Nothing是所有类型的子类型.Null类只有一个实例对象,null,类似于java中的null引用.null可以赋值给任意引用类型,但是不能赋值给值类型 2. Nothing,可以作为没有正常返回值的方法的返回类型,非常直观的告诉你这个方法不会正常返回,而且由于Nothing是其他任意类型的子类,他还能跟要求返回值的方法兼容 3. Unit类型用来标识过程,也就是没有明确返回值的函数 ## 不可变和可变的 **不可变的** ![](https://box.kancloud.cn/6600852b4aa28eceae6448ffedbb09a7_1041x921.png) **可变的** ![](https://box.kancloud.cn/0bd9463776b2d08833f1bd9fe16e3e38_1357x916.png) # 懒值 ~~~ def play1(a1: Int) = { println("play方法被执行") a1 } lazy val res = play1(10) println("res变量定义完毕") println(res) ~~~ 输出 ~~~ res变量定义完毕 play方法被执行 10 ~~~ # queue `new Queue[Int]()` queue ++= List(2,3,4) 向队列中追加list dequeue按进入队列的顺序删除元素 enqueue塞入数据 queue.head返回队列的第一个元素 queue.last 返回队列的最后一个元素 queue.tail 返回除了第一个元素以外的元素 # copy方法和带名参数 copy创建一个与现有对象值相同的新对象,并可以通过带名参数来修改某些属性 ~~~ val amt = Currency(29.95, "EUR") val price = amt.copy(value=19.95) ~~~