Scala
scala入门
Scala和Java的关系
语言特点
Scala是一门以Java虚拟机(JVM)为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言。
- Scala是一门多范式的编程语言,Scala支持面向对象和函数式编程。
- Scala源代码(.scala)会被编译成Java字节码(.class),然后运行于JVM之上,并可以调用现有的Java类库,实现两种语言的无缝对接。
- Scala单作为一门语言来看,非常的简洁高效。
变量和数据类型
注释
- Scala的注释和Java的注释是一样的,有三种,注释书写方式一样
- 单行注释
- 多行注释
- 文档注释
标识符的命名规范
-
和Java基本类似
-
以数字、字母、下划线、$及特殊符号(Java中没有,特殊符号指:+、-、*、/等)组成,但不能以数字开头。
-
驼峰命名、见名知意。
-
以操作符(特殊符号)开头,且只包含操作符(+ - * / # !等)
-
用反引号``包括的任意字符串,即使是关键字(39个)也可以
• package, import, class, object, trait, extends, with, type, for
• private, protected, abstract, sealed, final, implicit, lazy, override
•try, catch, finally, throw
•if, else, match, case, do, while, for, return, yield
•def, val, var
•this, super
•new
•true, false, null
变量
- var | val 变量名 [: 变量类型] = 变量值
- var和val,var修饰的是可变对象,val修饰不可变对象
- 声明变量时,类型可以省略(编译器自动推导,即类型推导)
- 类型确定后,就不能修改,说明Scala是强数据类型语言。
- 变量声明时,需要初始值
字符串输出
- 如何获得字符串
- 直接使用引号
- new String对象
- +拼接
- 和c类似。利用%s进行值传递
- 插值表达式通过s"${变量名/表达式}"进行传递
- 三引号,常用于sql中。
- 一些函数/方法
数据输入
- 控制台获取StdIn.read类型
- 读取文件Source.fromFile(Path).getLine
数据类型
-
数据类型介绍
-
Any: scala所有类的父类
- AnyVal: 值类型
- Byte、Short、Int、Float、Double、Long、Char、Boolean
- Unit: 相当于java的void, 有一个对象()
- stringops: 代表一系列对字符串的扩展类
- Unit: 相当于java的void, 有一个对象()
- Byte、Short、Int、Float、Double、Long、Char、Boolean
- AnyRef: 引用类型
- String,java class/数组/集合,scala class/数组/集合
- Null: 是所有引用类型的子类, 有一个实例null,一般用于给引用类型赋予初始值,在使用null给引用类型赋予初始值的时候必须指定变量的类型
- String,java class/数组/集合,scala class/数组/集合
- Nothing: 所有类的子类
-
数据转换
-
数字之间转换
- 低精度-》高精度:自动转换
- 高精度-》低精度:to低精度的类型
- 注意
- 高精度-》低精度:to低精度的类型
- 低精度-》高精度:自动转换
* 自动提升原则:有多种类型的数据混合运算时,系统首先**自动将所有数据转换成精度大的那种数据类型**,然后再进行计算。
* **当我们把精度大的数值类型赋值给精度小的数值类型时,就会报错**,反之就会进行自动类型转换。
* **(byte,short)和char之间不会相互自动转换。**
* byte,short,char他们三者可以计算,在计算时首**先转换为int类型。**
* Char类型可以保存Int的常量值,但不能保存Int的变量值,需要强转
-
数字和字符串之间转换
- 数字-》字符串:拼接/toString等
- 字符串-》数字:to类型
- 数字-》字符串:拼接/toString等
运算符
-
算术运算符
- +、-、*、/、%
-
关系运算符
- <、>、<=、>=、!=、==
-
逻辑运算符
- &&、||、!
-
赋值运算符
- =、+=、-=、*=、/=
-
位运算符
-
<< >> >>> & |
-
运算顺序:
- 和Java中一样,算术运算符》位运算》关系运算》逻辑运算》赋值
-
与Java的区别
流程控制
代码块
-
- 块表达式: 由{}包裹的一段代码称之为块表达式,有返回值,返回值是{}中最后一个表达式的结果值。
- 赋值运算的语句不算表达式的结果值
分支控制if-else
- 单分支
- 只有一个if判断代码块,没有else
- 双分支
- 有一个完整的if-else代码块
- 多分支
- 有一套完整的if-else if……else代码块
- 嵌套分支
- if-else中嵌套if
Scala中没有switch。
Scala中的分支有返回值,其值就是符合条件的块表达式的结果,即对应上述代码块的内容。
循环控制
for循环
-
for(变量 <- 数组/集合/表达式 ){循环语句}
- 范围列表常用使用A to F,表示从A数字到F数字{A,B,C,D,E,F}
- 范围列表也会使用A until F,表示从A数字到F-1数字{A,B,C,D,E}
-
循环守卫
- for循环的守卫: for(变量<- 数组/集合/表达式 if(布尔表达式)){ ... }
-
循环步长
- for(变量<- start to/until end by step){...}
-
嵌套循环
- for(变量<- 数组/集合/表达式 ; 变量<- 数组/集合/表达式 ; .... ){...}
- 第二个变量就是两层循环的开始
- 类似Java中的for(xx;xx;xx){for(xx;xx;xx){aaaa}}
- for(变量<- 数组/集合/表达式 ; 变量<- 数组/集合/表达式 ; .... ){...}
-
引入变量
-
for(变量<- 数组/集合/表达式 ; 变量2 = 值 ;变量<- 数组/集合/表达式 ; .... ){...}
-
for(i<- 0 to 10 ; k = i*i ;j<- i to k){ println(s"i+j=${i+j}") }
-
-
循环返回值yield
- 将遍历过程中处理的结果返回到一个新Vector集合中,使用yield关键字
- for循的循环体的{}默认不能看做块表达式,默认没有返回值
- 想要让for循环有返回值需要使用yield表达式
- 语法: for(变量<- 数组/集合/表达式) yield{....}
- 将遍历过程中处理的结果返回到一个新Vector集合中,使用yield关键字
while循环控制
- 语法:和Java基本一致
//while
循环变量初始化
while (循环条件) {
循环体(语句)
循环变量迭代
}
//do{...}while
循环变量初始化;
do{
循环体(语句)
循环变量迭代
} while(循环条件)
循环中断
-
说明:
Scala内置控制结构特地去掉了break和continue,是为了更好的适应函数式编程,推荐使用函数式的风格解决break和continue的功能,而不是一个关键字。scala中使用breakable控制结构来实现break和continue功能。
-
代码
//利用抛出异常来停止,实现break try{ while(a<=10){ if(a==5) throw new Exception("抛出异常......") else{ println(s"a=${a}") a=a+1 } } }catch { case e:Exception => } //利用抛出异常来停止,实现break while(a<=10){ try{ if(a==5) throw new Exception("抛出异常......") else{ println(s"a=${a}") a=a+1 } }catch { case e:Exception=> a=a+1 } }
//实现continue while(a<=10){ breakable( if(a==5){ a=a+1 break() } else{ println(s"a=${a}") a=a+1 } ) } //实现break breakable(while(a<=10){ if(a==5) break() else{ println(s"a=${a}") a=a+1 } })