Scala入门
Scala特点
静态类型
Scala的变量声明后不允许改变类型
Scala所有变量和表达式的类型在编译时就已经完全确定
强类型
一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型,也就是说不允许隐式类型转换
Scala没有提供Java中的强制类型转换,取代方法有
对象名.asInstanceOf[XXX]
对象名.toXXX方法
隐式转换(implicit关键字)
多范式编程
-面向对象
Scala中一切值都是对象
Scala中去除了static关键字,使用一种特殊的对象来模拟类对象(伴生对象)
Scala去除了接口的概念,引入特质概念
-函数式编程
Scala中一切函数都是值,所以可以将函数作为参数和返回值
常量与变量
val
常量一旦初始化将不可以被修改
var
变量可以重复赋值
类型推断
使用类型推断是必须指定变量初始值,否则无法进行类型推断
var a //错误定义方式
val a:Int=_ //错误定义方式,因为val定义为常量
数据类型
值类型(AnyVal)
直接存储值,在栈上存储其值
值类型与Java八大基本类型一致(byte、short、int、long、float、double、char、boolean)
Byte、Short、Int、Long、Float、Double、Char、Boolean
引用类型(AnyRef)
存储对其值的引用,在栈上存储地址,在堆上存储值
List、Option……
YourClass
字面量
直接在代码中写常量值(constant value)的方式
如整型字面量:0、0L、0xFF
特别地:符号字面量:'<标识符>,对应“scala.Symbol”类型
特殊类型
Null
scala.Null是所有引用类型的子类,仅一个实例对象“null”,并且“null”是关键字
Nothing
List()返回是List[Nothing]
Unit
仅有一个实例对象“()”,叫做无用占位符,类似于Java中的void类型,不同的是,在Java中void表示无返回值,但在Scala中,Unit表示有返回值,便是“()”,因为Scala认为一切表达式都有值
字符串插值器
s字符串插值
s"Hello, $name"等价于 StringContext("Hello, ", "").s(name)
s" $name Hello,"等价于 StringContext( "","Hello, ").s(name)
s"hi $name Hello,"等价于StringContext(" hi"," Hello,").s(name)
f字符串插值
可以进行格式化的输出,变量名后用%指定格式,如果没有指定,其作用和s是一样的
val hei = 2.345
println(f"The height is $hei%2.2f")
raw插值
让字符串原封原样的输出,屏蔽控制效果
println(raw"/t/n")
本质是隐匿转换的实现
程序控制
条件控制
任意表达式都有值,if语句也不例外
val x=10
val y=if(x==10) x+1 else "我是字符串"
循环控制
for(i<-1 to 5 if i%2==0;j<-1 to 5 if j%2!=0) println(s"$i+$j=${i+j}")
中断
scala.util.control.Breaks中breakable()和break()函数
for推导式
val j=for ( i: Int <- 1 to num; if i%2==0 ) yield i
注意循环体必须以yield开头,多行语句使用yield{...}
块表达式
在 Scala 中,“ {} ”块包含一系列值表达式,其结果也是表达式。块中最后一个表达式的值就是块的值,即 “{} ”块的值取决于最后一个表达式
数据结构
数组
数组是可变的,但长度是固定的
元组
对应Tuple1~Tuple22共22个类
使用“()”快速创建相应元组
元组访问使用“_”,下标由1开始
元组不支持遍历(Traversable)
for(i<-tp2.productIterator)println(i)
集合
-
Seq
IndexSeq:索引序列 Vector、String、Range、ArrayBuffer 对于基于索引的操作来说效率较高,一般底层依赖于数组实现 LinearSeq:线性序列 List、Stream、Stack、Queue、LinkedList 对于 head、tail,以及isEmpty一类的方法效率较高,一般底层依赖于链表实现
-
Set
Set集合中的元素不允许重复(常用于去重) Set中的元素是无序的 Set提供并、差、交集运算
-
Map
类似Java中的哈希表,存储键值对 var m=Map("a"->1) m += ("j"->0) //新加一个键值对 “+=”操作后产生了一个新Map 将变量m改为val定义,即会报错
-
可变与不可变
不可变:初始化后内容不再发生变化 可变:初始化后内容可以发生变化