1 Scala基础知识和语法
1.1 语法特点
(1)可拓展:面向对象、函数式编程
(2)兼容JAVA:类库调用、互操作
(3)语法简洁:代码行短、类型推断、抽象控制
(4)静态类型化:可检验、安全重构
(5)支持并发控制:强计算能力、自定义其他控制结构
1.2 Scala和Java的关系
(1)都是基于JVM虚拟机运行的
Scala编译之后的文件也是.class,都要转换为字节码,然后运行在JVM虚拟机之上。
(2)Scala和Java相互调用
在Scala中可以直接调用Java的代码,同时在Java中也可以直接调用Scala的代码
(3)Java 8 vs Scala
- Java 8(lambda)没有出来之前,Java只是面向对象的一门语言,但是Java 8出来以后,Java就是一个面向对象和面向函数的混合语言了。
- 首先我们要对Scala进行精确定位,从某种程度上讲,Scala并不是一个纯粹的面向函数的编程语言,有人认为 Scala是一个带有闭包的静态面向对象语言),更准确地说,Scala是面向函数与面向对象的混合。
- Scala设计的初衷是面向函数FP(function progaming),而Java起家是面向对象OO(objected oriented),现在两者都是OO和FP的混合语言,是否可以这么认为:Scala = FP + OO,而Java = OO+ FP?moving…
- 由于面向对象OO和面向函数FP两种范式是类似横坐标和纵坐标的两者不同坐标方向的思考方式,类似数据库和对象之间的不匹配阻抗关系,两者如果结合得不好恐怕就不会产生1+1>2的效果。
- 面向对象是最接近人类思维的方式,而面向函数是最接近计算机的思维方式。如果你想让计算机为人的业务建模服务,那么以OO为主;如果你希望让计算机能自己通过算法从大数据中自动建模,那么以FP为主。所以,Java可能还会在企业工程类软件中占主要市场,而Scala则会在科学计算大数据分析等领域抢占Java市场,比如Scala的Spark大有替代Java的Hadoop之趋势。
1.3 Scala解释器
(1)Scala解释器读到一个表达式,对它进行求值,将它打印出来,接着再继续读下一个表达式。这个过程被称做读取–求值–打印–循环,即:REPL。
(2从技术上讲,scala程序并不是一个解释器。实际发生的是,你输入的内容被快速地编译成字节码,然后这段字节码交由Java虚拟机执行。正因为如此,大多数scala程序员更倾向于将它称做“REPL”。
1.4 var和val定义变量
scala中定义变量,通过var或者val来进行,如果要定义一个函数,就是def。 - var:定义的是(可变的量)变量
- val:定义的是不可变的量,类似java中被final关键字修饰的变量,只能进行输出。
在开发过程中,建议搭建使用后者val,而不是var,除非我们操作的一个变量需要进行修改,除此以外使用val进行修饰。
变量的定义方式:val/var aaa:Int = 3,但是scala觉得这种写法太过啰嗦,可以做自动类型的推断,所以上述的写法就可以转化为:var/val aaa = 3
1.5 Scala数据类型
数据类型 | 描述 |
---|---|
Byte | 8bit的有符号数字,范围-128-127 |
Short | 16bit的有符号数字,范围-32768-32767 |
Int | 32bit的有符号数字,范围-2147483648-2147483647 |
Long | 64bit的有符号数字 |
Float | 32bit,单精度浮点数 |
Double | 64bit,双精度浮点数 |
Char | 16bit Unicode字符,范围U+0000到U+FFFF |
String | 字符串 |
Boolean | 布尔类型 |
Unit | 表示无值,和其他语言中的void等同 |
Null | 空值或空引用 |
Nothing | 所有其他类型的子类型,表示没有值 |
Any |
所有类型的超类,任何实例都属于any类型 |
AnyRef |
所有引用类型的超类(数组、集合) |
- 要点
1.Any 是所有类的父类,包括值类型 AnyVal ,和引用类型 AnyRef。
2.AnyVal 是 所有值类型的父类,包括 Int ,Double ,Boolean ,Unit 等等。
3.AnyRef 是所有引用类型的父类,包括 Null。
4.Null 是所有引用类型的子类。
5.Nothing 是所有类的子类。
6.Unit 类型只有一个实例,是() ,相当于 java中的 void ,没有任何的实质意义。
7.Null 也只有一个实例,是 null , 相当于 java中的 null ,能赋值 给任何引用 类型。
2 Scala控制结构
2.1 if 表达式
(1)与java中的if或者if-else或者if-else if-else相比,有一点不同,scala的if-else有返回值。scala中的任何表达式都有返回值!scala中返回值,不需要使用return语句,最后一句,自动作为返回值。
(2)scala中语句的终止不需要使用";",当然如果一行上面有多条语句,无法进行区分,就只能使用";"来进行分割;
object IfDemo {
def main(args:Array[String]):Unit = {
val age = 18
/*
if(age >= 18) {
println("adult~")
} else {
println("kid")
}*/
val ret = if(age >= 18) {
"adult~"
} else {
"kid"
}
println("ret : " + ret)
}
}
知识点补充
java中代码执行顺序:静态代码块-父类构造代码块和构造方法-子类构造代码块和构造方法。
scala中的代码块可没有静态代码块或者构造代码块,就是普通的代码,就是在{}之间有多条语句在执行,不同之处和java中的,scala中的代码块有返回值!scala中的代码块通常用来做一些变量的初始化:
2.2 循环
scala中的循环和java中的循环一样,不同之处在于,for写法不大一样,同时,循环表达式也有返回值。
(1)while
object WhileDemo {
def main(args:Array[String]):Unit = {
//计算1+。。。+10的和
var sum = 0
var n = 1
while(n <= 10) {
sum += n
//n++ //++在scala中是集合中的方法,不能当做java中的自增操作
n += 1
}
println("sum: " + sum)
}
}
(2)do…while
object DoWhileDemo {
def main(args:Array[String]):Unit = {
//计算1+。。。+10的和
var sum = 0
var n = 1
do {
sum += n
n += 1
}while(n <= 10)
println("sum = " + sum)
}
}
(3)for
scala中的for循环,并没有像java中的基本循环
for(初始化;条件表达式;自增) {
循环体
}
scala中的for循环,更像java中的高级for循环(foreach):
java中的foreach操作:for(Person p : persons) {…}
scala中的for循环操作:for(p <- persons) {....}
scala> val str = "hello"
str: String = hello
scala> for(ch <- str) {
| print( "\t")
| }
=========结 果============
h e l l o
(4)for循环的嵌套
object ForDemo {
def main(args:Array[String]):Unit = {
//乘法口诀
/*for(int j = 0; j <= 5; j++) {
for(int i = 0; i <= 4; i++) {
System.out.print("*
}
System.out.println();
}*/
for(j <- 1 to 9) {
for(i <- 1 to 9) {
if(i <= j) {
print(i + "*" + j + "=" + (i * j) + "\t")
}
}
println()
}
}
}
不过scala提供了另外更加强大的简写方式:
for(j <- 1 to 9; i <- 1 to 9 if i <= j ) {
print(i + "*" + j + "=" + (i * j) + "\t")
if(i == j)
println
}
2.3 循环的终止
java中的循环终止主要有:break、continue和return。
在scala中没有break,没有continue,一般也不用return。
scala中终止循环有3种方式:
- 使用boolean变量来控制循环
- 使用return表达式跳出循环
- 使用scala提供的工具——breakable来控制循环
小知识点补充:有一个带有C风格格式化字符串的printf函数–system.in
printf("Hello, %s! You are %d yearsold.\n", "Fred", 42)
//输出结果为:Hello, Fred! You are 42 yearsold.
示例:循环的终止:登录账号的案例,验证用户名和密码,如果超过3次,提示输入有误,锁定账号10分钟。
举例一:使用boolean变量来控制循环
object LoopTerminateDemo {
def main(args:Array[String]):Unit = {
val dbName = "xxy"
val dbPwd = 123456
var count = 3
while(count > 0) {
count -= 1
val name = readLine("请输入您的姓名:")
print("请输入您的密码:")
val pwd = readInt()
var msg:String = null
if(name == null || pwd == null) {
msg = "error:用户名或密码不能为空!"
}
if(name == dbName && pwd == dbPwd) {
println(s"welcome ${name}~~~~")
//循环得需要终止
count = 0
} else {
msg = "用户名或密码有误,请重试!"
}
if(msg != null) {
println(s"$msg\t您还有${count}次重试机会")
}
}
}
}
举例二:使用breakable结束循环的操作
使用breakable来结束循环,得需要导入breakable的包。
import scala.util.control.Breaks._
object LoopTerminateDemo {
def main(args:Array[String]):Unit = {
val dbName = "xxy"
val dbPwd = 123456
var count = 3
breakable {
while(count > 0) {
count -= 1
val name = readLine("请输入您的姓名:")
print("请输入您的密码:")
val pwd = readInt()
var msg:String = null
if(name == null || pwd == null) {
msg = "error:用户名或密码不能为空!"
}
if(name == dbName && pwd == dbPwd) {
println(s"welcome ${name}~~~~")
//循环得需要终止
//count = 0
break
} else {
msg = "用户名或密码有误,请重试!"
}
if(msg != null) {
println(s"$msg\t您还有${count}次重试机会")
}
}
}
}
}
来源:CSDN
作者:prroda
链接:https://blog.csdn.net/prroda/article/details/103540998