变量定义

val

可以不声明类型,scala自动推断类型

  1. val a = "123";

也可以直接声明类型

  1. val b: String = "123";

注意: val声明的变量,声明好了之后,值是不可变的,相当于final修饰了,但是可以用val重新赋值

  1. scala> val k = "123"
  2. k: String = 123
  3. scala> k = "234"
  4. <console>:12: error: reassignment to val
  5. k = "234"
  6. ^
  7. scala> val k = "234"
  8. k: String = 234

推荐用val,方便垃圾回收

var

和val相比,var是可以重新赋值的

常用类型

scala和java一样,有7种数值类型Byte, Char, Short, Int, Long, Float和Double(无包装类型)和一个Boolean类型

循环

注意:scala没有++这个操作符

  1. scala> val s = "hello123";
  2. s: String = hello123
  3. scala> for (c <- s) println(c)

for里面的就是把s遍历出来的元素赋值给c

表达式1-10循环

  1. for (i <- 1 to 10)
  2. println(i)

循环数组

  1. # val arr = Array[String](_"a"_ "b"_ "c")
  2. val arr = Array("a", "b", "c")
  3. for (i <- arr)
  4. println(i)

高级循环

每个生成器都可以带一个条件,注意: if前面没有分号

  1. scala> for (i <- 1 to 3; j<- 1 to 3 if i != j)
  2. | println(i + "---" + j)

for推导式
如果for循环的循环体以yield开始,则该循环会构建出一个集合
每次迭代生成集合中的一个值

  1. val v = for (i <- 1 to 10) yield i * 10
  2. println(v)
  3. Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)

util包左不包右

  1. val a = Array("a", "b", "c")
  2. for(i <- 0 util a.length) println(a(i))

while循环中断

  1. import scala.util.control.Breaks
  2. val loop = new Breaks
  3. var n = 1
  4. loop.breakable{
  5. while(n<=20) {
  6. n+=1;
  7. println(n)
  8. if(n == 18) {
  9. loop.break()
  10. }
  11. }
  12. }

多重while循环

  1. import scala.util.control.Breaks
  2. val loop1 = new Breaks
  3. val loop2 = new Breaks
  4. var count = 1
  5. loop1.breakable {
  6. while (true) {
  7. count += 1
  8. println(count)
  9. if (count == 10) {
  10. loop1.break()
  11. }
  12. loop2.breakable {
  13. while (true) {
  14. println(count)
  15. count += 1
  16. if (count == 20) {
  17. loop2.break()
  18. }
  19. }
  20. }
  21. }
  22. }

判断

支持混合类型的表达式

  1. scala> val x = 1
  2. x: Int = 1
  3. scala> val z = if(x>1) 1 else "error"
  4. z: Any = error

可以缺失else
如果缺失else,相当于if (x>2) 1 else ()

  1. scala> val m = if (x>2) 1
  2. m: AnyVal = ()

块表达式

  1. scala> val x = 0
  2. x: Int = 0
  3. scala> val result = {
  4. | if(x>0) {
  5. | -1
  6. | } else if(x>=1) {
  7. | 1
  8. | } else {
  9. | "error"
  10. | }
  11. | }
  12. result: Any = error

操作符重载

  1. a+b

是如下方法调用的简写

  1. a.+(b)

a方法b可以写成a.方法(b)

方法

  1. scala> def m(x:Int) : Int = x*x
  2. m: (x: Int)Int
  3. scala> m(4)
  4. res0: Int = 16

可以把返回值类型去掉

  1. def m(x:Int) : x*x

可以返回空

  1. scala> def n (y:Int, z:Int) : Unit = println(y+z)
  2. n: (y: Int, z: Int)Unit
  3. scala> val a = n(1,3)
  4. 4
  5. a: Unit = ()

还可以这样写

  1. scala> def n(y: Int, z: Int) {
  2. | println(y+z)
  3. | }
  4. n: (y: Int, z: Int)Unit

类型

image.png

AnyVal表示值类型
AnyRef表示引用类型

scala中,所有的值都是类对象,而所有的类,包括值类型,都最终继承自一个统一的根类型Any.
统一类型,是scala的一个特点,scala还定义了几个底层类(Bottom Class),比如Null和Nothing

  1. Null是所有引用类型的子类型,而Nothing是所有类型的子类型.Null类只有一个实例对象,null,类似于java中的null引用.null可以赋值给任意引用类型,但是不能赋值给值类型
  2. Nothing,可以作为没有正常返回值的方法的返回类型,非常直观的告诉你这个方法不会正常返回,而且由于Nothing是其他任意类型的子类,他还能跟要求返回值的方法兼容
  3. Unit类型用来标识过程,也就是没有明确返回值的函数

不可变和可变的

不可变的

image.png

可变的

image.png

懒值

  1. def play1(a1: Int) = {
  2. println("play方法被执行")
  3. a1
  4. }
  5. lazy val res = play1(10)
  6. println("res变量定义完毕")
  7. println(res)

输出

  1. res变量定义完毕
  2. play方法被执行
  3. 10

queue

new Queue[Int]()

queue ++= List(2,3,4) 向队列中追加list
dequeue按进入队列的顺序删除元素
enqueue塞入数据
queue.head返回队列的第一个元素
queue.last 返回队列的最后一个元素
queue.tail 返回除了第一个元素以外的元素

copy方法和带名参数

copy创建一个与现有对象值相同的新对象,并可以通过带名参数来修改某些属性

  1. val amt = Currency(29.95, "EUR")
  2. val price = amt.copy(value=19.95)