温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Scala基础知识有哪些

发布时间:2021-12-08 14:43:26 来源:亿速云 阅读:116 作者:iii 栏目:大数据

本篇内容主要讲解“Scala基础知识有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala基础知识有哪些”吧!

Scala运行于Java平台(JVM)上,兼容现有的Java程序,Scala代码可以调用Java方法,访问Java字段,继承Java类和实现Java接口。但是Scala也拥有像 Java 类似的特性,它集合了面向对象编程思想与函数式编程思想。

scala具有如下几个特点:

  • 一切变量皆为对象:scala是一门纯粹的面向对象的语言,没有Java中的原生类型。

  • 语法简洁

  • 具有强大的并发性:能够更好地支持分布式系统

1 基础知识

基本数据类型

Scala的基本数据类型包括:Byte、Char、Short、Int、Long、Float、Double和Boolean,虽然是基本数据类型,但是由于scala中每个值都是对象,所以这些数据类型都是一个类。在Scala中,除了String是使用了java.lang.String,其余的基本类型都是scala中的,比如 Int 的全名是 scala.Int。

基本数据类型描述
Byte8位有符号补码整数。数值区间为 [-27, 27-1]
Short16位有符号补码整数。数值区间为 [-215, 215-1]
Int32位有符号补码整数。数值区间为 [-231, 231-1]
Long64位有符号补码整数。数值区间为 [-263, 263-1]
Float32 位, IEEE 754 标准的单精度浮点数
Double64 位, IEEE 754 标准的双精度浮点数
Char16位无符号Unicode字符, 数值区间为 [0, 216-1]
String字符序列
Booleantrue, false

字面量

字面量分为整数字面量、浮点数字面量、布尔型字面量、字符及字符串字面量和Unit字面量。

val i = 1  //1就是整数字面量val i = 9.9 //9.9就是浮点数字面量val i = true //true就是布尔型字面量val i = 'A' //'A'就是字符字面量val i = "Hello World!" //"Hello World!"就是字符串字面量

Unit字面量只有一个唯一的值,表示为()。

操作符

Scala的操作符与Java的基本一致,但Scala的操作符实际上是方法,也就是说操作符只是方法的另一种形式。

比如:5 + 4 等价于 5.+(4) ,实际上 “+” 是Int类里的一个方法。

对于基本类型的操作,scala还提供了许多常用的方法,这些方法被封装在每个类对应的富包装类中,上文提到的九个基本类型都有其对应的富包装类,比如,Int类型对应的富包装类为RichInt类。

富包装类位于包scala.runtime中,当一个对象调用了富包装类中的方法,scala会自动通过隐式转换将该对象转换为富包装类对象。

变量

scala只有两种类型的变量,用val和var来声明。它们之间的区别在于:

val 声明的变量不可变,val声明时必须初始化变量,且初始化后不再赋新值;

var声明的变量可变,即它可以被多次赋值。

  • val

    val b:String = "hello"    //声明一个String类型的不可变变量 bval b = "hello"       //与上式等同


  • var

    var a:Int = 9         //声明一个Int类型的可变变量 a


    由于scala具有类型推断机制,它会通过变量的值自动推断其数据类型,所以上面的语句也可以写成:

    val a = 9


    如果要把 a声明为Double类型,那么就需要显式定义

    val a:Double = 9


输入/输出 (I/O)

  • 从控制台输入输出

    • 输入

      scala中提供了以read为前缀的许多方法,供不同类型的数据类型进行输入输出,分别是readByte, readByte, readInt, readLong, readFloat, readDouble, readChar, readBoolean 以及readLine,这些方法都在scala的包io.StdIn中。

      readLine对应读取String类型的数据,可以不提供参数,也可以提供一个字符串类型的参数作为输入提示。

    • 输出

      可以使用 print()方法或者println()向控制台输出,或者采用格式化输出方法printf()。

  • 文件的读写

    Java类库java.io.PrintWriter实现文本文件的创建与写入。PrintWriter也提供了控制台输出方法 print()和println()。

    Scala使用类scala.io.Source实现对文件的读取,最常用的方法是getLines,它返回一个包含文件所有行迭代器(Iterator)。

控制结构

  1. if 条件表达式

    if结构与Java的相同。比如:

    val x = 3if (x=0) {     println("1")} else if (x>0) {     println("2")} else {     println("3")}


  2. while 循环

    while循环的格式与Java中也完全相同。

    val x = 10while (x>0) {     println("hello")x-=1}


  3. for 循环

    这是一个很简单的for循环实例:

    for (i <- 1 to 5) println(i)


    它遍历1到5的所有整数值并打印输出,这里的语法跟Java中就不太一样了。那么1 to 5是什么呢?

    现在我们运行scala的REPL模式,输入语句: 1 to 5,得到的是一个Range类型的对象,它是一个序列,它可以表示为(1,2,3,4,5)。

    scala> 1 to 5val res0: scala.collection.immutable.Range.Inclusive = Range 1 to 5


    在执行for循环时,我们经常会用到数值序列,比如,i的值从1循环到5,这时就可以采用Range来实现。Range可以支持创建不同数据类型的数值序列,包括Int、Long、Float、Double、Char、BigInt和BigDecimal等。

  4. 对循环的控制

    scala中没有Java中的break,continue关键字,因为

  5. 异常处理结构

    scala的异常处理不会像Java中那样使用throw将异常抛出,它只使用try-catch结构对异常进行捕获。这是因为scala中将所有异常都当作非检查型,不支持Java中的检查型异常。

    检查型异常(Checked Exception)与非检查型异常(Unchecked Exception)

    检查型异常(编译期异常)就是编译器检查了你的代码之后发现的异常,它强制开发者必须处理这些异常之后才能通过编译。Java中可以通过throw/throws/try-catch来处理这种异常。

    非检查型异常就是编译器不强制检查的那一类异常,Java中所有继承自RuntimeException的异常都属于非检查型异常(运行期异常),这种异常往往可以避免,也可以进行异常处理。如果不进行异常处理,那么如果有异常产生,则异常将由JVM进行处理,这也会导致程序的执行中断。

数据结构

数组 Array

Scala 语言中提供的数组是一种可变的、可索引的、元素具有相同类型的数据集合。数组一般包括定长数组和变长数组。

数组的实例化:

val intArr = new Array[Int](3)      //长度为3的Int型数组val strArr = Array("hello","world","!")

上面第2行的代码也实例化了一个数组对象,实际上这里隐式调用了Array的伴生对象的apply方法(在之后的面向对象编程思想部分会介绍)。

数组元素的赋值:

intArr(0) = 12intArr(1) = 1intArr(2) = 90

和Java不一样的地方在于scala使用圆括号()进行元素的索引,而java使用的是方括号[]

元组 Tuple

scala元组和数组其实很相似,只不过元组中的元素可以是不同类型的,而数组中只能存储相同类型的元素。

scala中提供了TupleN(N的范围为1~22),用于创建一个包含N个元素的元组。

元组的好处在于:如果想要在方法里返回多个不同类型的对象,就可以将它们封装在元组中,省去了重新定义一个类然后封装返回值的步骤,元组是Java中不具有的。

元组的实例化:

val tuple = ("hello","world",123)

元素的访问:

tuple._(1)   //通过 ._(索引) 的方式访问元素,索引从1开始

以上代码访问的元素为"hello"。

容器 Collection

scala定义了容器库(Collection),包含序列(Seq),映射(Map),集合(Set)等数据结构。

scala用了三个包来组织不同类别的容器类,分别是 scala.collection ,scala.collection.mutable,scala.collection.immutable。

  • scala.collection.mutable

这个包中定义了元素可变的容器。

  • scala.collection.immutable

    这个包中定义了元素不可变的容器。

  • scala.collection

这个包中定义了元素可变和元素不可变的容器的超类或特质 (相当于Java的接口,将在面向对象编程部分介绍)。

容器的宏观层级关系

Scala基础知识有哪些

  • Traverable特质为所有容器定义了foreach抽象方法,具有Traverable特质的容器必须实现foreach方法

  • Iterable特质为所有容器定义了iterator抽象方法,具有Iterale特质的容器必须实现iterator方法,返回一个迭代器(Iterator)

序列

序列是指元素可以安按照特定的顺序来访问的容器。所有类型的序列都具有collection.Seq 特质,包括了可变对象和不可变对象的抽象。

Seq中常用的实现如下图:

Scala基础知识有哪些

  • 列表 List

    列表被定义在scala.collection.immutable 中,列表中的元素相同,一旦定义了就不能再改变。

    因此,列表声明时也需要初始化:

    val alist = List("charge","free","sql")    //不指定类型,由scala自行推断val blist = List[Int](1,2,3)            //指定List的元素类型


    由于列表是一个特质,故声明时不能使用new关键字,这里同样隐式调用了List的工厂方法apply。

    列表的常用方法:

    1. head:返回列表的第一个元素

    2. tail:返回列表中除了第一个元素以外的所有元素组成的新列表

包括List在内的所有容器类型,若没有显式指定元素类型,scala会选择所有初始值的最近公共类型来作为容器元素的类型,比如:

val cList = List("hello",3.14,22)

cList的类型则被指定为Any (所有类的父类)。因为Any是String, Dounle和Int这三个类型的最近公共类型。

Vector

  1. :+:向序列的尾端添加元素

  2. +::向序列的前端添加元素

    +=与+:的区别:+=会修改当前序列,+: 只是将序列修改后的结果赋给新的序列,对原序列不做修改。

    List 和Vector的可变版本分别为 ListBuffer和ArrayBuffer,位于scala.collection.mutable中。

  • Range

    Range是一个不可变数字等差数列。

集合

集合中没有重复的元素。集合包括可变集合和不可变集合,分别位于scala.collection.mutable 和scala.collection.immutable中。默认情况下创建的是不可变集

集合中的元素并不按插入顺序排列,而是通过hash 的方法来组织元素。

映射

映射中的元素是一个个的键值对,在一个映射中只存在唯一的键。映射包括可变映射和不可变映射。

迭代器 Iterator

迭代器可以按顺序访问容器元素。迭代器是“一次性”使用的,它不支持随机访问,只能按照从前往后的顺序访问元素,每访问完一个元素就将其从迭代器中删除,直至迭代器中没有元素为止。所以在遍历完所有元素后再次使用该迭代器就会报错。

常用方法 (与Java中相同):

  • next:用于返回迭代器的下一个元素

  • hasNext:用于判断是否还有下一个元素

到此,相信大家对“Scala基础知识有哪些”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI