Scala学习系列(三)——入门与基础

Scala学习系列(三)——入门与基础
www.zeeklog.com  - Scala学习系列(三)——入门与基础

本课程源码共享于 https://github.com/tree1123/learning-scala

首先,打开IDEA编辑器的SbtExampleProject项目,我们将在这个项目下进行练习

本节的练习内容位于 com.tree1123.Base 中 新建一个main函数

www.zeeklog.com  - Scala学习系列(三)——入门与基础

一 、声明值和变量

Scala声明变量有两种方式,一个用val,一个用var

声明格式为:val/var 变量名【:变量类型】 = 变量值

val定义的值是不可变的 类似于一个常量

IDEA的快捷键 Enter + Alt 方便给出提示, 我们这样增加变量类型, 便于初学时 , 清楚看到scala的类型推断

www.zeeklog.com  - Scala学习系列(三)——入门与基础

熟练以后 我们可以将变量类型省略

www.zeeklog.com  - Scala学习系列(三)——入门与基础

val类型是常量

www.zeeklog.com  - Scala学习系列(三)——入门与基础

var类型是变量

www.zeeklog.com  - Scala学习系列(三)——入门与基础

注意:var和val关键字只标识引用本身是否可以指向另一个不同的对象,它们并未表明其所引用的对象是否可变。为了减少可变性引起的bug,应该尽可能的使用不可变变量。

变量类型可以省略,解析器会根据值进行推断。val和var声明变量时都必须初始化。

    object Base {

  def main(args: Array[String]): Unit = {

    //使用val定义的变量值是不可变的,相当于java里用final修饰的变量
    val aaa: Int = 4 * 2

    //aaa = 10
    //使用var定义的变量是可变的,在Scala中鼓励使用val
    //变量名在前,类型在后
    var bbb: Int = 4 * 2
    bbb = 10
  }

}

二、常用类型

Scala有8种数据类型,和Java一样,有7种数值类型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等,为基本类型提供了更多的有用操作。

www.zeeklog.com  - Scala学习系列(三)——入门与基础

scala的toString其实就是由Predef中的隐式转换完成将相应类型转换成Rich*,然后调用Rich*的相对应方法.

在scala中通过方法进行类型转换,不像Java的强制类型转换。

www.zeeklog.com  - Scala学习系列(三)——入门与基础

注意:Scala中没有强制转换 需要通过方法进行类型的转换

Scala中所有的值都是类对象,而所有的类,包括值类型,都最终继承自一个统一的根类型Any。

统一类型,是Scala的一大特点。而且Scala还定义了几个底层类(Bottom Class),比如Null和Nothing。

www.zeeklog.com  - Scala学习系列(三)——入门与基础

1)Null是所有引用类型的子类型,而Nothing是所有类型的子类型。Null类只有一个实例对象,null,类似于Java中的null引用。null可以赋值给任意引用类型,但是不能赋值给值类型。

2)Nothing,可以作为没有正常返回值的方法的返回类型,直观的说明这个方法不会正常返回。而且由于Nothing是其他任意类型的子类,他还能跟要求返回值得方法兼容。

3)Unit类型用来标识过程,也就是没有明确返回值的函数。由此可见,Unit类似于Java里的void。Unit只有一个实例,(),这个实例也没有实质的意义。

三、算术和操作符

一个运算符是一个符号,用于告诉编译器来执行指定的数学运算和逻辑运算。

Scala 含有丰富的内置运算符,包括以下几种类型:

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 位运算符

赋值运算符

算术运算符

下表列出了 Scala 支持的算术运算符。

假定变量 A 为 10,B 为 20:

www.zeeklog.com  - Scala学习系列(三)——入门与基础
关系运算符

下表列出了 Scala 支持的关系运算符。

假定变量 A 为 10,B 为 20:

www.zeeklog.com  - Scala学习系列(三)——入门与基础
逻辑运算符

下表列出了 Scala 支持的逻辑运算符。

假定变量 A 为 1,B 为 0:

www.zeeklog.com  - Scala学习系列(三)——入门与基础
位运算符

位运算符用来对二进制位进行操作,~,&,|,^分别为取反,按位与与,按位与或,按位与异或运算,如下表实例:

www.zeeklog.com  - Scala学习系列(三)——入门与基础

Scala 中的按位运算法则如下:

www.zeeklog.com  - Scala学习系列(三)——入门与基础
赋值运算符

以下列出了 Scala 语言支持的赋值运算符:

www.zeeklog.com  - Scala学习系列(三)——入门与基础

注意:scala的算术操作可以完成和Java中相同的工作,但是有一点区别,他们都是方法。

Scala中没有 ++ --操作符 需要通过+= -=

www.zeeklog.com  - Scala学习系列(三)——入门与基础

四、Scala几个特性

Scala除了方法,还提供了函数

调用函数 需要引入函数包 import 包名. 下划线是通配符 等同于java中的*

www.zeeklog.com  - Scala学习系列(三)——入门与基础

Scala中没有静态方法,一般通过单例对象或者伴生对象进行实现

 BigInt.probablePrime(100,scala.util.Random)

调用对象方法

"Hello".distinct

apply,update方法

apply是调用时可以省略方法名的方法,用于构造和获取元素

//下边两者等同
"Hello"(4)
"Hello".apply(4)
//下边两者等同
Array(1,2,3)
Array.apply(1,2,3)

在StringOps中会发现一个def apply(n:Int):Char的方法定义

update方法也是调用时可以省略方法名的方法,用于元素的更新

//两者等同
var arr = Array(1,2,3)
    arr(2)=5
    arr.update(2,5)

option类型

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

www.zeeklog.com  - Scala学习系列(三)——入门与基础