scala 入门
scala 入门初探
本章介绍scala 入门基本知识
scala 解释器
- 变量
- 冒号和类型
- 等号
- 结果
当对多个文件调用scala时, 需要首先对他们进行编译
但scalar 比较慢, 推荐使用fsc, fsc 会启动一个后台程序,扫描jar文件, 调用fsc时,仅把源码提交给后台进行编译
变量定义
- val, 类似java的final变量
- var, 非final变量
函数定义:
如果函数结果可以推导出来,可以不用写函数结果的类型
如果函数体只有一行,可以不用写花括号
Unit 表示void 类型
scala脚本:
循环语句
while
foreach
args.foreach(arg => println(arg))
等价
args.foreach((arg: String) => println(arg))
如果函数语句只有一行,并且直邮一个参数,可以缩写参数
args.foreach(println)
for 语法
数组
其中 for(i <- 0 to 2)
有一个原则:
方法若只有一个参数并且方法返回值有接收者,调用时,可以省略点和括号
因此等价于 for (i <- 0.to(2))
其中greetStrings 指定了数组变量,因此不能修改为其他变量,但内部是可以重新赋值的
greetString(0) 等价于 greetString.apply(i)
任何对于对象值参数应用都(直接用传递一个活多个值参数时)被转化为对apply方法的调用
当对带有括号,并包括1到若干参数赋值时, 编译器自动调用对象的update函数,对括号里面的参数和等号右边的对象执行调用
greetStrings(0) = “hello”
转化为
greetStrings.update(0, “hello”)
还可以更加简洁
等价于
list
scala.List 不同于java 的java.util.List, 一旦创建就不可改变, 内部的元素也是不可变的。
::: 实现叠加功能
:: 发音 cons, 把新元素添加到列表的最前端, 并且它是右操作符
下面可以得到和上面一样的结果, Nil 是空列表的简写
列表没有append操作
原因是,随列表增长, append耗时也会增长, 而:: 操作耗时是固定的。
如果想做append操作
- 调用::, 然后调用reverse
- 使用ListBuffer
list 函数列表, List 索引基于0
Tuple
Tuple 也是不可变对象, 但和List不同, 它可以含有不同类型的元素
tuple的索引是基于1:
1 | 99 |
为什么是基于1, 因为对于静态类型元组其他语言 Haskell/ML 1是传统。
不能使用pair(0), 因为pair(0)就是 pair.apply(0), 但apply不能满足一个函数返回不同的类型, 因此不能这样操作
# set
set分为可变set和不可变set
scala的trait 类似java的interface
实现了java的接口,在scala里面称为mix in trait
默认是不可变set
例如:
当执行+= 操作时, 实际上是创建一个新的set
如果需要可变set, 得必须指定是可变set
map
map也分可变map和不可变map, 不可变map是默认的
scala的任何对象都可以调用->函数, 返回包含键值对的二元组
副作用
scala里面有一种行为,常常称为副作用, 就是不返回值的行为称为副作用。暗指一个该函数重复执行不能得到一个明确的结果。
有一种仅为了副作用而执行的方式:
1 | def add(b: Byte): Unit = sum += b |
可以改写为
1 | def add(b: Byte) {sum += b} |
去掉类型和=, 并用花括号来包括
另外因为任何类型都可以转化为Unit, 因此,当一个函数结果是某个类型比如string时, 但函数返回类型指定了Unit, 则丢弃结果
因此这种情况很容易导致用户发生错误, 比如用户其实是想要返回值,但漏写了=, 于是导致函数无结果返回
分号;
当一行只有一个语句时,可以不用分号, 当有多个语句时,得用分号
1 | val s = "hello"; println(s) |
但注意 scala 是把操作符放到尾部
1 | x + |
等价于(x+y+z) 但如果是
1 | x |
则变成了3个独立语句