本篇内容主要讲解“Scala基础知识有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala基础知识有哪些”吧!
Scala运行于Java平台(JVM)上,兼容现有的Java程序,Scala代码可以调用Java方法,访问Java字段,继承Java类和实现Java接口。但是Scala也拥有像 Java 类似的特性,它集合了面向对象编程思想与函数式编程思想。
scala具有如下几个特点:
一切变量皆为对象:scala是一门纯粹的面向对象的语言,没有Java中的原生类型。
语法简洁
具有强大的并发性:能够更好地支持分布式系统
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
从控制台输入输出
输入
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)。
if 条件表达式
if结构与Java的相同。比如:
val x = 3if (x=0) { println("1")} else if (x>0) { println("2")} else { println("3")}
while 循环
while循环的格式与Java中也完全相同。
val x = 10while (x>0) { println("hello")x-=1}
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等。
对循环的控制
scala中没有Java中的break,continue关键字,因为
异常处理结构
scala的异常处理不会像Java中那样使用throw将异常抛出,它只使用try-catch结构对异常进行捕获。这是因为scala中将所有异常都当作非检查型,不支持Java中的检查型异常。
检查型异常(Checked Exception)与非检查型异常(Unchecked Exception)
检查型异常(编译期异常)就是编译器检查了你的代码之后发现的异常,它强制开发者必须处理这些异常之后才能通过编译。Java中可以通过throw/throws/try-catch来处理这种异常。
非检查型异常就是编译器不强制检查的那一类异常,Java中所有继承自RuntimeException的异常都属于非检查型异常(运行期异常),这种异常往往可以避免,也可以进行异常处理。如果不进行异常处理,那么如果有异常产生,则异常将由JVM进行处理,这也会导致程序的执行中断。
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使用的是方括号[]
。
scala元组和数组其实很相似,只不过元组中的元素可以是不同类型的,而数组中只能存储相同类型的元素。
scala中提供了TupleN(N的范围为1~22),用于创建一个包含N个元素的元组。
元组的好处在于:如果想要在方法里返回多个不同类型的对象,就可以将它们封装在元组中,省去了重新定义一个类然后封装返回值的步骤,元组是Java中不具有的。
元组的实例化:
val tuple = ("hello","world",123)
元素的访问:
tuple._(1) //通过 ._(索引) 的方式访问元素,索引从1开始
以上代码访问的元素为"hello"。
scala定义了容器库(Collection),包含序列(Seq),映射(Map),集合(Set)等数据结构。
scala用了三个包来组织不同类别的容器类,分别是 scala.collection ,scala.collection.mutable,scala.collection.immutable。
scala.collection.mutable
这个包中定义了元素可变的容器。
scala.collection.immutable
这个包中定义了元素不可变的容器。
scala.collection
这个包中定义了元素可变和元素不可变的容器的超类或特质 (相当于Java的接口,将在面向对象编程部分介绍)。
容器的宏观层级关系
Traverable特质为所有容器定义了foreach抽象方法,具有Traverable特质的容器必须实现foreach方法
Iterable特质为所有容器定义了iterator抽象方法,具有Iterale特质的容器必须实现iterator方法,返回一个迭代器(Iterator)
序列是指元素可以安按照特定的顺序来访问的容器。所有类型的序列都具有collection.Seq 特质,包括了可变对象和不可变对象的抽象。
Seq中常用的实现如下图:
列表 List
列表被定义在scala.collection.immutable 中,列表中的元素相同,一旦定义了就不能再改变。
因此,列表声明时也需要初始化:
val alist = List("charge","free","sql") //不指定类型,由scala自行推断val blist = List[Int](1,2,3) //指定List的元素类型
由于列表是一个特质,故声明时不能使用new关键字,这里同样隐式调用了List的工厂方法apply。
列表的常用方法:
head:返回列表的第一个元素
tail:返回列表中除了第一个元素以外的所有元素组成的新列表
包括List在内的所有容器类型,若没有显式指定元素类型,scala会选择所有初始值的最近公共类型来作为容器元素的类型,比如:
val cList = List("hello",3.14,22)cList的类型则被指定为Any (所有类的父类)。因为Any是String, Dounle和Int这三个类型的最近公共类型。
Vector
:+
:向序列的尾端添加元素
+:
:向序列的前端添加元素
+=与+:的区别:+=会修改当前序列,+: 只是将序列修改后的结果赋给新的序列,对原序列不做修改。
List 和Vector的可变版本分别为 ListBuffer和ArrayBuffer,位于scala.collection.mutable中。
Range
Range是一个不可变数字等差数列。
集合中没有重复的元素。集合包括可变集合和不可变集合,分别位于scala.collection.mutable 和scala.collection.immutable中。默认情况下创建的是不可变集。
集合中的元素并不按插入顺序排列,而是通过hash 的方法来组织元素。
映射中的元素是一个个的键值对,在一个映射中只存在唯一的键。映射包括可变映射和不可变映射。
迭代器可以按顺序访问容器元素。迭代器是“一次性”使用的,它不支持随机访问,只能按照从前往后的顺序访问元素,每访问完一个元素就将其从迭代器中删除,直至迭代器中没有元素为止。所以在遍历完所有元素后再次使用该迭代器就会报错。
常用方法 (与Java中相同):
next:用于返回迭代器的下一个元素
hasNext:用于判断是否还有下一个元素
到此,相信大家对“Scala基础知识有哪些”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。