一 Scala 命令行或者解释器的使用
REPL:Read(取值)--> Evaluation(求值)-->Print(打印)-->Loop(循环)
Scala解释器也被称为REPL,会快速编译成字节码,然后交给JVM
来执行
计算表达式:解释器中,解释器返回的值,如果没有指定变量来存储,那么值默认名称为res,而且会显示结果数据类型,比如Int,Double
等等
比如输入:1+1
那么会看到
res0:Int = 2
内置变量:在后面可以能继续使用res这个变量,以及他存放的值
scala>12*res0
res1:Int = 24
自动补全:我们可以使用tab健进行自动补全
二 变量声明
>>声明val变量:可以声明val变量存放表达式的计算结果
scala>val a = 5;
a:Int = 5
scala>a+1
res4:Int = 6
特点:可以用于后续计算,但是不能改变值或者引用
比如:
scala>a = 7;
<console>:11:error: reassignment to val
a = 7;
会报错
这就看类似于java final变量,在运行时不可变。
>>声明var变量:可以改变值或者引用
scala>var result = 7;
result:Int = 7
scala>result = 9;
result:Int = 9
特点:可以用于计算,也可以改变值或则引用
但是scala建议使用val变量也就是常量,在spar中,需要大量网络传输,如果用var,后面的值可能会被改变。
>>指定类型:无论声明val或者var变量,都可以手动指定其类型,如果不指定的话,Scala会自动根据值,进行类型判断
语法:变量类型变量名:数据类型 = 值
scala>var name:String = null;
name:String = null
scala>name = "nicky";
scala>val name:Any = "Bely"
name:Any = Bely
Scala与Java的关系是非常紧密的,因为scala是基于java 虚拟机,所有scala代码都需要经过编译为字节码然后交由JVM来运行,所以Scala是可以和java无缝操作的,可以任意调用Java的代码。
>>声明多个变量:可以将多个变量放在一起声明
scala>val username,password:String = null;
username:String = null
password:String = null
三 数据类型 与 操作符
Byte、Char、Short、Int、Long、Float、Double、Boolean
与Java的基本数据类型的包装类型相同,但是Scala没有基本数据类型与包装类型的概念,统一都是类。Scala自己会负责基本数据类型和引用类型的转换操作。
类型的加强版类型
Scala使用很多加强类给数据类型增加了上百种增强的功能或函数,
String类通过StringOps类增强了大量的函数,"Hello".intersect("World")。
Scala还提供了RichInt、RichDouble、RichChar等类型,RichInt就提供了to函数1.to(10),此处Int先隐式转换为RichInt,然后再调用其to函数
基本操作符
Scala的算术操作符与Java的算术操作符也没有什么区别,比如+、-、*、/、%等,以及&、|、^、>>、<<等。
但是,在Scala中,这些操作符其实是数据类型的函数,比如1 + 1,可以写做1.+(1)
例如,1.to(10),又可以写做1 to 10
scala中没有提供++、--操作符,我们只能使用+和-,比如counter= 1,counter++是错误的,必须写做counter+= 1.
四 函数调用 与Apply()
导入库
importscala.math._
scala>sqrt(2);
res12:Double = 1.4142135623730951
scala>pow(2,4);
res14:Double = 16.0
如果函数没有参数,我们也不需要给函数加括号
scala>"hello Hello".distinct
res18:String = helo H
apply函数
apply函数时scala里面比较特殊的函数,在Scala的object中,可以声明apply函数,使用类名()形式,其实就是类名.apply()的缩写。通常使用这种方式构造类的对象,而不是使用new 类名();
举个例子:Array(1,2, 3, 4),实际上是用Arrayobject的apply()函数创建Array类的实例,也就是一个数组
五 条件控制与循环
====================================================
5.1if 表达式
5.1.1if表达式的定义
在Scala中,if表达式是有值的,就是if或者else中最后一行返回的值。
例如:val age= 30; if(age > 18) 1 else 0
可以将if表达式赋予一个变量,例如:valisAdult = if (age > 18) 1
else0
另外一种写法:
varisAdult = -1;
if(age > 18) isAdult = 1 else isAdult =0;
但是第一种写法更推荐
5.1.2if表达式类型判断
因为if表达式是有值的,而if和else子句的值类型可能不同,此时
if表达式的值是什么类型呢?Scala会自动判断,取两个类型的公共
父类型
举例说明:
>>if(age> 18) 1 else 0,表达式的类型是Int,因为1和0都是Int
>>if(age> 18) "adult" else 0,此时if和else的值分别是String和Int,则表达式的值是Any,Any是String和Int的公共父类型
>>如果if后面没有跟else,则默认else的值是Unit,也用()表示,类似于java中的void或者null。例如,val age= 12; if(age > 18) "adult"。
此时就相当于if(age> 18) "adult" else ()。
示例代码:
scala>if(age > 18){
| "adult"} else{
| "children"}
res25:String = adult
或者输入:paste 然后进入粘贴模式
scala>:paste
//Entering paste mode (ctrl-D to finish)
if(age>18)
"audlt"
else
"children"
最后按住crtl+D,结果将会被打印
注意,粘贴模式中不要使用tab
5.1.3if语句放在多行
默认情况下,REPL 只能解释一行语句,但是if表达式通常需要放在
多行
可以使用{}的方式:
varr = if (age > 18) {
"audit"
}elseif (age > 12) {
"teenager"
}else{
"children"
}
5.2语句终结符 和 块表达式
5.2.1语句终结符
我们知道java里,每一条语句结束需要加上;无论是否是一行。但是scala
如果只有单个语句,则不需要加;
如果一行要放多条语句,那么势必就需要加终结符了,不然无法识别
到底是不是一条语句
诸如:var a,b, c = 0; if(a < 10) { b = b + 1; c = c + 1 }
通常来说,多行语句可以这样书写:
通常来说,对于多行语句,还是会使用花括号的方式
if(a< 10) {
b = b + 1
c = c + 1
}
5.2.2块表达式
块表达式就是块中的语句,其中可以包含多条语句,最后一个语句的值
就是块表达式的返回值。
scala>var a, b, c = 0;
a:Int = 0
b:Int = 0
c:Int = 0
scala>var d = if(a < 10) { b = b + 1; c + 100 }
d:AnyVal = 100
最后一行语句的值就是块语句的返回值
5.3输入和输出
5.3.1print和println
print打印不加换行符,而println会加换行符
5.3.2printf
可以用于进行格式化
printf("Hi,my name is %s, I'm %d years old.\n", "Leo", 30)
5.3.3readLine
readLine允许我们从控制台读取用户输入的数据,类似于java中的System.in和Scanner的作用。
scala>val name = readLine("Welcome to Game House. Please tell me your name:")
warning:there was one deprecation warning; re-run with -deprecation for details
Welcometo Game House. Please tell me your name: name: String = nicky
scala>print("Thanks. Then please tell me your age: ")
Thanks.Then please tell me your age:
scala>val age = readInt()
warning:there was one deprecation warning; re-run with -deprecation for details
age:Int = 16
scala>if(age > 18) {
| printf("Hi, %s, you are %d years old, so you are legel to comehere!", name, age)
| } else {
| printf("Sorry, boy, %s, you are only %d years old. you are illegalto come here!", name, age)
| }
Sorry,boy, nicky, you are only 16 years old. you are illegal to come here!
5.3.4高级for循环
scala> for(i <- 1 to 9; j <- 1 to 9) {
| if(j == 9) {
| println(i+"*" +j+"="+i * j)
| } else {
| print(i+"*" +j+"="+i * j+" ")
| }
| }
1*1=11*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9
2*1=22*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18
3*1=33*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27
4*1=44*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36
5*1=55*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45
6*1=66*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54
7*1=77*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63
8*1=88*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72
9*1=99*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
if守卫:取偶数
for(i<- 1 to 100 if i % 2 == 0) println(i)
for推导式:构造集合
for(i<- 1 to 10) yield i