Scala 语法基础

来源:互联网 发布:linux上最好的输入法 编辑:程序博客网 时间:2024/05/18 18:20

一 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

0 0
原创粉丝点击