Scala基础语法

Posted henryyao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala基础语法相关的知识,希望对你有一定的参考价值。

1 基础语法

1.1 基本数据类型??????

Scala的基础类型和Java相似,包括String,以及数值类型 Int,Long,Short,Byte,Float,Double,Char和Boolean。相应的取值范围也和java相同。这使得Scala编译器在产出的字节码中将Scala的值类型转换成Java基本类。?????? 以上基本类型的字面量也和java相同,有一点不同的是Scala的String提供了一种原生字符串类型。在java中可以使用反斜杠加上一些字母来进行转义,如果要表示反斜杠本身的话就要在前面再加上反斜杠对本身进行转义。而Scala支持将字符串包括在三个双引号(""" """) 中 就不会对里面的内容进行转义而原封不动的输出。例如:

技术图片

1.2 变量?

Scala拥有两种类型的变量,分为var和val。其中val和java的final变量类似,一旦初始化就不不能再被重新赋值。定义变量的格式是:val/var??变量名:变量类型=变量值 例如: 技术图片

也可以省略类型的声明,因为scala会根据字面量推断出变量类型。 例如: 技术图片

需要注意的就是变量类型不是在变量名之前,而是在变量名之后,并用:隔开。????

1.3 函数

函数声明由def开始,然后是函数名和圆括号中以逗号隔开的参数列表。参数列表之后是以冒号隔开的返回值类型标注,然后是等号花括号的函数体。 例如: 技术图片

注意:每个参数必须加上以冒号(:)隔开的类型标注,因为scala并不会推断参数的类型。相反的,返回值类型可以省略交给scala推断(递归函数必须显示给出)。同时如果函数体只有一条语句时,可以省略花括号。所以,上面的函数也可以像下面这样定义: 技术图片

Unit结果类型代表函数不返回任何有实际意义的结果,类似与java的void。? 例如: 技术图片

函数的调用和java相似,函数名加括号,括号里写上传入的参数。 例如: 技术图片

如果函数没有任何入参,后面的括号也可以省略。 例如: 技术图片

你可能注意到了,在函数max中我们并没有return任何结果。这是因为if表达式是有返回结果的(后面会再仔细介绍),例如: 技术图片

而函数的返回值默认是最后一个表达式的返回结果。也正是因为这样scala才能自行推断返回值类型。

scala是函数式的语言,意味着函数在scala中是一等的值。也就是说函数值的地位和整数,字符串是相同的。可以将函数作为参数传递给其他函数,作为返回值返回他们,或者将它们保存在变量里。 例如: 可以像下面这样把函数赋值给一个变量: 技术图片

其中(x,y)=>if(x>y) x else y 称作函数的字面量。

这里也可以省略变量m的类型参数(Int,Int)=>Int 交由scala自行推断,不过函数字面量中的参数类型必须显示给出,不然会报错。 技术图片

也可以像下面这样把函数当作一个参数: 技术图片

其中arr是一个数组,a=>println(a) 也就是函数字面量,也可以传入一个函数的引用。例如: 技术图片

另外,如果函数字面只接受单个参数,可以不给出参数名和参数本身。例如: 技术图片

1.4 数组,集合,元祖

1.4.1 数组

你可以用以下方式创建一个数组: 技术图片 其中String代表数组类型为字符串,3是数组大小。但scala并不推荐这样创建数组。 数组的赋值和访问使用圆括号,不同于java的方括号。如下: 技术图片 在scala中,访问一个数组的元素,其实是方法的调用。比如上面的arr1(0)会被转换成arr1.apply(0)。到后面我们会发现这是一个通用的规则,对象直接跟圆括号,就是对该对象apply方法的调用 scala推荐的创建数组方式如下: 技术图片 其实这里也是应用了上面所说的规则,这里创建数组其实是调用了Array这个对象的apply方法。所以,你还可以这样创建数组: 技术图片

1.4.2 列表

scala的List和数组类型,不同的是数组是可变的,而List是不可变的(对List的进行任何有变动的操作,都会返回一个新的List)。 创建List的方式如下: 技术图片 List常用方法: ::,读作“cons”,用于在已有列表前增加一个元素,并返回一个新的列表。例如: 技术图片

:::,用于拼接两个列表,并返回一个新的列表。例如: 技术图片

:+,在列表后增加一个元素,并返回一个新的列表。该方法很少使用,因为操作时间随列表的元素个数线性增长,而::则是常量时间。如下: 技术图片

空列表: 定义一个空列表可以有如下方式: 技术图片

所以,我们也可以用以下方式构建列表: 技术图片

需要注意的是,是从右往左执行的。

1.4.3 元祖

元祖和List类型,也是不可变的,与List不同的是,元祖可以容纳不同的类型的元素。当你需要从方法返回多个对象时,元祖非常有用。 元素的创建与访问方式如下: 技术图片 scala会根据字面量自动推断出元祖的类型为Tuple2[String,Int]

1.4.4 集合

scala集合分为可变的和不可变的,他们的继承关系如下:

graph TD A[scala.collection.Set] --> B[scala.collection.immutable.Set] A[scala.collection.Set] --> C[scala.collection.mutableSet] B-->D[scala.collection.immutable.HashSet] C -->E[scala.collection.mutable.HashSet]

可以看到有三个Set特质(类似于java的接口),但他们的完整路径不同。我们在创建集合时,如果不指定默认创建不可变集,也就是scala.collection.immutable.Set,如果要创建可变集,需要导入相应的类或特质。例如:

技术图片 技术图片

1.5 类和对象

1.6 分支,循环

1.6.1 while循环

while循环和java类似,如下: 技术图片

1.6.2 if语句

if语句和java类似,不同的是if语句是有返回值的,上面也有提及。

1.6.3 for循环

1.7 权限控制

1.8 继承混入

以上是关于Scala基础语法的主要内容,如果未能解决你的问题,请参考以下文章

scala函数式编程 scala基础语法介绍

Scala 基础语法

Scala基础语法

Scala基础部署数据类型及简单语法

Scala基础部署数据类型及简单语法

Scala执行流程与基础语法