大数据学习笔记之Scala(二):第2章 Scala基础

2.1 声明值和变量

Scala 声明变量有两种方式,一个用 val,一个用 var。
val / var 变量名 [: 变量类型] = 变量值
val 定义的值是不可变的,类似于一个常量。
大数据学习笔记之Scala(二):第2章 Scala基础
值得注意的是如果是array的话,是可变的,在scala中提供了可变的array和不可变的array
大数据学习笔记之Scala(二):第2章 Scala基础

Scala REPL 默认为匿名变量分配 val。
就像下图中把8*5的值给了res0
大数据学习笔记之Scala(二):第2章 Scala基础
var 声明的变量是可变的。
大数据学习笔记之Scala(二):第2章 Scala基础
大数据学习笔记之Scala(二):第2章 Scala基础
注 : var 和 和 val 关键字只标识引用本身是否可以指向另一个不同的对象,它们并未表明其所引用的对象是否可变。为了减少可变性引起的 bug ,应该尽可能地使用不可变变量。 变量类型可以省略, 解析器会根据值进行推断。l val 和 和 r var 声明变量时都必须初始化 。

就好像java中的一个apple类,里面的属性值虽然是可以变得,但是apple这个类的标识符是不变的

2.2 常用类型

Scala 有 8 种数据类型:Byte、Char、Short、Int、Long、Float、Double
以及 Boolean。
 Boolean: true 或者 false
 Byte: 8 位, 有符号
 Short: 16 位, 有符号
 Int: 32 位, 有符号
 Long: 64 位, 有符号
 Char: 16 位, 无符号
 Float: 32 位, 单精度浮点数
 Double: 64 位, 双精度浮点数
跟 java 中的数据类型不同, Scala 并不区分基本类型和引用类型 ,所以这些类型都是对象,可以调用相对应的方法。String 直接使用的是java.lang.String. 不过,由于 String 实际是一系列 Char 的不可变的集合,Scala 中大部分针对集合的操作,都可以用于 String,具体来说,String 的这些方法存在于类 scala.collection.immutable.StringOps 中。 由于 String 在需要时能隐式转换为StringOps,因此不需要任何额外的转换,String 就可以使用这些方法。每一种数据类型都有对应的 Rich* 类型,如 RichInt、RichChar 等,为基本类型提供了更多的有用操作。
大数据学习笔记之Scala(二):第2章 Scala基础
由定义在 Predef 中的隐式转换完成将相应类型转换成 Rich*,然后调用
Rich*的相对应方法。【隐式转换后面会讲】
在 Scala 中通过方法进行类型转换,不像 Java 的强制类型转换。

在scala中除了比如byte里面定义的这些方法之外,还在Rich中定义了更多的方法
大数据学习笔记之Scala(二):第2章 Scala基础

大数据学习笔记之Scala(二):第2章 Scala基础
注 :a Scala 中没有强制转化,需要通过方法进行类型的转 化 。

Scala 中,所有的值都是类对象,而所有的类,包括值类型,都最终继承自一个统一的根类型 Any,相当于java中的object。统一类型,是 Scala 的又一大特点。更特别的是,Scala 中还定义了几个底层类(Bottom Class),比如 Null 和 Nothing。
大数据学习笔记之Scala(二):第2章 Scala基础
any相当于object,下面有anyref引用类型,anyval值类型(这里所说的值类型并不是java中最终的值类型),在anyval下面有一个unit,相当于java中的viod,null是anyref下面的子类,nothiing是所有类的子类

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

2.3 算术和操作符重载

±*/%可以完成和 Java 中相同的工作,但是有一点区别,他们都是方
法。你几乎可以用任何符号来为方法命名。
a.方法(b) 等于 a 方法 b
大数据学习笔记之Scala(二):第2章 Scala基础
注 :a Scala 中没有 ++ 、 - - 操作符 ,需要通过 += 、- -= = 。

2.4 调用函数和方法

除了方法,Scala 还提供了函数,比如数学函数。
调用函数:
需要引入函数包 import 包名 ._ _ 是通配符 , 等同于 java 中的 *
大数据学习笔记之Scala(二):第2章 Scala基础
调用静态方法:
Scala 中没有静态方法 , 一般通过单例对象或者伴生对象进行实现 。
这里的单例对象和java中的单例对象一个意思,伴生对象,相当于类的静态方法
大数据学习笔记之Scala(二):第2章 Scala基础
调用对象方法:
对象实例调用方法
大数据学习笔记之Scala(二):第2章 Scala基础

2.5 apply 、update 方法

apply 方法是调用时可以省略方法名的方法。用于构造和获取元素
“Hello”(4) 等同于 “Hello”.apply(4)
Array(1,2,3) 等同于 Array.apply(1,2,3)

在 StringOps 中你会发现一个 def apply(n: Int): Char 方法定义。
update 方法也是调用时可以省略方法名的方法,用于元素的更新,
arr(4) = 5 等同于 arr.update(4,5)

2.6 option 类型

Scala 为单个值提供了对象的包装器,表示为那种可能存在也可能不存在的值。他只有两个有效的子类对象,一个是 Some,表示某个值,另外一个是None,表示为空,通过 Option 的使用,避免了使用 null、空字符串等方式来表示缺少某个值的做法。

在java中经常出现空指针异常,
大数据学习笔记之Scala(二):第2章 Scala基础
大数据学习笔记之Scala(二):第2章 Scala基础
包括还有isEmpty的方法
大数据学习笔记之Scala(二):第2章 Scala基础