scala 入门

scala 入门初探

本章介绍scala 入门基本知识

scala 解释器

scala shell
scala shell
- 变量
- 冒号和类型
- 等号
- 结果

当对多个文件调用scala时, 需要首先对他们进行编译 build

但scalar 比较慢, 推荐使用fsc, fsc 会启动一个后台程序,扫描jar文件, 调用fsc时,仅把源码提交给后台进行编译 fsc build

变量定义

  • val, 类似java的final变量
  • var, 非final变量

函数定义:

function_def image 如果函数结果可以推导出来,可以不用写函数结果的类型 如果函数体只有一行,可以不用写花括号 Unit 表示void 类型

scala脚本:

image
image

循环语句

while foreach

args.foreach(arg => println(arg)) 等价 args.foreach((arg: String) => println(arg))

如果函数语句只有一行,并且直邮一个参数,可以缩写参数 args.foreach(println)

for 语法

image
image

数组

image
image

其中 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")

还可以更加简洁

1
1

等价于

1
1

list

scala.List 不同于java 的java.util.List, 一旦创建就不可改变, 内部的元素也是不可变的。

::: 实现叠加功能

1
1

:: 发音 cons, 把新元素添加到列表的最前端, 并且它是右操作符

2
2

下面可以得到和上面一样的结果, Nil 是空列表的简写

1
1

列表没有append操作 原因是,随列表增长, append耗时也会增长, 而:: 操作耗时是固定的。 如果想做append操作

  • 调用::, 然后调用reverse
  • 使用ListBuffer

list 函数列表, List 索引基于0

1
1

Tuple

Tuple 也是不可变对象, 但和List不同, 它可以含有不同类型的元素

1
1

tuple的索引是基于1:

1
2
99
Luftballons

为什么是基于1, 因为对于静态类型元组其他语言 Haskell/ML 1是传统。 不能使用pair(0), 因为pair(0)就是 pair.apply(0), 但apply不能满足一个函数返回不同的类型, 因此不能这样操作

# set set分为可变set和不可变set

1
1

scala的trait 类似java的interface 实现了java的接口,在scala里面称为mix in trait

默认是不可变set 例如:

1
1

当执行+= 操作时, 实际上是创建一个新的set

如果需要可变set, 得必须指定是可变set

1
1

map

map也分可变map和不可变map, 不可变map是默认的

1

scala的任何对象都可以调用->函数, 返回包含键值对的二元组

2

副作用

scala里面有一种行为,常常称为副作用, 就是不返回值的行为称为副作用。暗指一个该函数重复执行不能得到一个明确的结果。 有一种仅为了副作用而执行的方式:

1
def add(b: Byte): Unit = sum += b
可以改写为
1
def add(b: Byte) {sum += b}

去掉类型和=, 并用花括号来包括

另外因为任何类型都可以转化为Unit, 因此,当一个函数结果是某个类型比如string时, 但函数返回类型指定了Unit, 则丢弃结果

1
1

因此这种情况很容易导致用户发生错误, 比如用户其实是想要返回值,但漏写了=, 于是导致函数无结果返回

分号;

当一行只有一个语句时,可以不用分号, 当有多个语句时,得用分号

1
val s = "hello"; println(s)

但注意 scala 是把操作符放到尾部

1
2
3
x +
y +
z

等价于(x+y+z) 但如果是

1
2
3
x
+y
+z
则变成了3个独立语句