Scala基础知识有哪些

本篇内容主要讲解“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。

基本数据类型 描述
Byte 8位有符号补码整数。数值区间为 [-27, 27-1]
Short 16位有符号补码整数。数值区间为 [-215, 215-1]
Int 32位有符号补码整数。数值区间为 [-231, 231-1]
Long 64位有符号补码整数。数值区间为 [-263, 263-1]
Float 32 位, IEEE 754 标准的单精度浮点数
Double 64 位, IEEE 754 标准的双精度浮点数
Char 16位无符号Unicode字符, 数值区间为 [0, 216-1]
String 字符序列
Boolean true, 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基础知识有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程之家网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 TwemojiTwemoji是Twitter开源的其完整的Emoji表情图片。开发者可以去GitHub下载完整的表情库,并把这些表情加入到自己的应用或网页中。使用示例:var i = 0;twemoji.parse(  ’emoji, m\u276
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即两个对象在内存中的首地址;equals比较字符串中所包含的内容是否相同。publicstaticvoidmain(String[]args){​ Strings1="abc"; Strings2=newString("abc");​ System.out.println(s1==s2)
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala怎么使用”吧!语法scala...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相信很多人在Scala是一种什么语言问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相信很多人在Scala Trait怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日常操作中,相信很多人在Scala类型检查与模式匹配怎么使用问题上存在疑惑,小编查阅了各式资料,整理...
这篇文章主要介绍“scala中常用但不常见的符号有哪些”,在日常操作中,相信很多人在scala中常用但不常见的符号有哪些问题上存在疑惑,小编查阅了各式资料,整理...
本篇内容主要讲解“Scala基础知识有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala基础知识有哪些”...
本篇内容介绍了“scala基础知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧...
本篇内容介绍了“Scala下划线怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧...
本篇内容主要讲解“Scala提取器怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala提取器怎么使用”...
这篇文章主要讲解了“Scala基础语法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Scala基础语法有...
本篇内容主要讲解“Scala方法与函数怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala方法与函数怎...
这篇文章主要讲解了“scala条件控制与循环怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“scala条...
这篇文章主要介绍“scala函数怎么定义和调用”,在日常操作中,相信很多人在scala函数怎么定义和调用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操
这篇文章主要介绍“scala如何声明变量”,在日常操作中,相信很多人在scala如何声明变量问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
这篇文章主要讲解了“scala的Map和Tuple怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“scala的Ma...
这篇文章主要介绍“scala的隐式参数有什么作用”,在日常操作中,相信很多人在scala的隐式参数有什么作用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的...
本篇内容主要讲解“Scala怎么进行文件写操作”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala怎么进行文件...
这篇文章主要讲解了“Scala怎么声明数组”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Scala怎么声明数组...