Scala基础语法大全总结(一)

Scala语言是一门基于JVM的编程语言,具有强大的功能,它即具有类似Java的面向对象的特性,而且也类似于C语言面向过程,函数也是一等公民,即不需要在隶属于哪一个类就可以执行。基于JVM的特性,使得scala和Java可以无缝互操作,scala可以任意操作Java的代码,两者的联系紧密。

Scala解释器的使用:

REPL: Read(读值)、Evaluation(计算)、Print(打印)、Loop(循环)。
scala解释器也称REPL,可以快速编译scala代码为字节码交给JVM执行。
在解释器中直接输入内容,将会返回一个变量,默认以res开头,然后依次res0、res1。
在解释器中的变量可以在后续操作中继续使用,也可以读取其值。
在scala>命令行中可以使用tab键自动补全。

常量与变量

在scala中定义常量使用val关键字来定义,类似于Java中使用final定义的常量,它定义常量之后不能修改,可以在后续操作中使用。如果想要修改它的值就会报错,如下所示:
这里写图片描述
常量的使用可以增加程序的健壮性,鲁棒性和安全性,在大型 系统中,一些固定的值通常定义为常量。

scala中使用var关键字来定义变量,即可以修改它的值,这个定义方式类似于JavaScript中定义 方式。

无论是常量还是变量,都可以为其添加数据类型,不过也可以不用添加,如上图所示,它会自动类型推荐,c常量就是Int类型。当然也可以定义其类型,和其他语言相反的,它的定义方式是变量名在前面,类型在后面,变量名和类型之间用冒号隔开(和GO语言类型,不过go语言不需要用冒号隔开)。

scala> var str:String="hello world"
str: String = hello world

还可以多个变量或者常量一起定义(说实话和go语言挺像的):

scala> val a,b,c=1
a: Int = 1
b: Int = 1
c: Int = 1

数据类型和操作符
在scala中,和Java中的数据类型差不多,Byte,Char,Short,Long,Int,String,Float,Double,Boolean等等,不过需要注意的是scala中的数据类型和Java中的数据类型本质上有区别中,scala中的数据类型每一个都是一个类,scala会自己负责基本数据类型和引用类型的转换操作。因此使用上面的数据类型可以直接调用相关函数,如:

1.toString()
1.to(10)

同时scala中使用了很多加强类为基本数据类型添加了上百种增强的功能和函数。例如String类通过StringOps类增强了大量的函数,如下面求两个字符串的交集字符:

scala> "Hello".intersect("world")
res0: String = lo

scala也提供了RichInt、RichDouble、RichChar等类型,RichInt也会调用to函数,比如1.to(10)。此处Int会首先隐式转换为RichInt,然后再调用其to函数。(隐式转换后续文章中详细介绍,这时scala中的一个很重要的特性)

在scala中,如+,-等各种操作符都是数据类型的函数,对于1+1这样的表达式也可以写成1.+(1)的形式。不过在scala中没有++,–这样的操作符,可以使用+=,-=来代替。

函数调用

和Java一样,如果调用scala的相关函数,直接导入相关包就可以调用。不过在scala中,在调用函数不传递参数的时候可以省略后面的括号,比如,“Hello World”.distinct()可以写为“Hello World”,distinct。

在scala中,还有一种特殊的函数apply,在scala的Object中,它通常用来实例化一个类,在创建一个对象的时候,通常是 类名() 这样的形式,实际上它是调用了 类名.apply() 来实例对象。

If条件语句与输入输出

在scala中,与其他编程语言有很大的区别,if语句有返回值。if和else条件语句的最后一行就是if语句的返回值。

scala> val aa=25
aa: Int = 25

scala> if (aa>20) "more than" else "less than"
res1: String = more than

如上所示,if语句返回了String类型的字符串,可是我们没有定义返回值的数据类型,if语句又是如何知道它的数据类型的呢?实际上,if语句会结合if和else语句最后一行返回的值来取其返回值类型的公共父类来作为返回值的类型。比如上面String和String的父类是String,Int和String类型的公共父类是Any。

如果只有if语句而没有else语句,那么实际上是if返回值的类型和else的返回值Unit来取公共父类,Unit相当于Java 中的void或者null,也可以写作();如if(a>10) 5 相当于if(a>10) 5 else ()。

scala默认不使用语句终结符,一行写一条语句,但是如果想要在一行写多条语句,这些语句之间必须使用“;”隔开。

在scala中使用print或者println来输出结果,和Java 一样。输入使用readLine来从控制台读取用户输入的数据,类似于Java 中的System.in。

循环语句

scala中的while语句和Java中一样,可以参考Java或者C++等其他语言的while语句来使用。

scala中的for循环语句有点类似于python中for循环,不过,写法上有点区别,首先来看个例子:

scala> val n:Int=10
n: Int = 10

scala> var tmp=0
tmp: Int = 0
scala> for(i <- 1 to 10)
     | tmp+=i

scala> println(tmp)
55

上面代码使用for循环连续求和。也可以对字符串使用for循环遍历字符串:

scala> for(c <- "Hello World")
     | println(c)
H
e
l
l
o

W
o
r
l
d

在scala中没有提供break等终止循环的语句,不过我们可以定义Boolean类型变量来自己实现或者使用Breaks类的函数break来终止循环,同样还可以使用return语句来终止。

高级for循环

for循环还提供了简介的语法,在Java中,我们写多重for循环,可能会像下面这样写:

for(i=0;i<10;i++){
    for(j=0;j<10;j++){
       //循环体
       }
     }

但是在 scala中,我们可以将两个for循环语句写到一个for循环语句中,例如:

for(i <- 1 to 10;j <- 1 to 10)
  if(j==9)
    println(i*j)
  else
    print(i*j+" ")

执行结果如下:

1 2 3 4 5 6 7 8 9
10 2 4 6 8 10 12 14 16 18
20 3 6 9 12 15 18 21 24 27
30 4 8 12 16 20 24 28 32 36
40 5 10 15 20 25 30 35 40 45
50 6 12 18 24 30 36 42 48 54
60 7 14 21 28 35 42 49 56 63
70 8 16 24 32 40 48 56 64 72
80 9 18 27 36 45 54 63 72 81
90 10 20 30 40 50 60 70 80 90
100

我们还可以有更加简洁的书写方式 ,即if守卫,比如下面代码打印偶数:

for(i <- 1 to 10 if i%2==0)
print(i+" ")

我们也可以使用for循环通过yield来构造集合,如下代码所示:

scala> for(i <- 1 to  5) yield i%3
res0: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 0, 1, 2)

函数

scala中定义函数使用def关键字来定义一个函数,函数的每个参数必须指定参数类型,在函数体中有返回值时,与Java等其他语言不同的时,scala中不需要使用return来返回,默认的函数体最后一行的表达式就是函数的返回值,也可以不用定义函数返回值的具体返回类型,scala可以进行自动类型推断,具体定义形式看下面Demo:

def func(name:String,age:Int)={
 println("my name is "+name+",i am "+age+"years old.")
}
func("shinelon",19)

函数执行结果如下所示:

my name is shinelon,i am 19years old.

在函数中也可以使用缺省函数,即当不需要为某一个函数的参数传递值,需要使用默认值的时候,这时可以给参数设置默认值:

def func(name:String,age:Int=19)={
 println("my name is "+name+",i am "+age+"years old.")
}
func("shinelon")

上面这段代码和上面代码的执行结果是一样的,不过设置函数参数的默认值的时候必须将没有设置默认值的参数依次防止在最左边。

还可以使用序列来调用变长参数的函数,不过这时函数的参数定义形式稍有改变,如下面函数形式:

def func(nums:Int*):Int={
 if(nums.length==0) 0
 else nums.head+func(nums.tail:_*)
}
func(1,2,3,4,5)

函数的执行结果如下:

res3: Int = 15

猜你喜欢

转载自blog.csdn.net/qq_37142346/article/details/80977744