您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Scala基礎(chǔ)知識(shí)有哪些”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Scala基礎(chǔ)知識(shí)有哪些”吧!
Scala運(yùn)行于Java平臺(tái)(JVM)上,兼容現(xiàn)有的Java程序,Scala代碼可以調(diào)用Java方法,訪問(wèn)Java字段,繼承Java類和實(shí)現(xiàn)Java接口。但是Scala也擁有像 Java 類似的特性,它集合了面向?qū)ο缶幊趟枷肱c函數(shù)式編程思想。
scala具有如下幾個(gè)特點(diǎn):
一切變量皆為對(duì)象:scala是一門(mén)純粹的面向?qū)ο蟮恼Z(yǔ)言,沒(méi)有Java中的原生類型。
語(yǔ)法簡(jiǎn)潔
具有強(qiáng)大的并發(fā)性:能夠更好地支持分布式系統(tǒng)
Scala的基本數(shù)據(jù)類型包括:Byte、Char、Short、Int、Long、Float、Double和Boolean,雖然是基本數(shù)據(jù)類型,但是由于scala中每個(gè)值都是對(duì)象,所以這些數(shù)據(jù)類型都是一個(gè)類。在Scala中,除了String是使用了java.lang.String,其余的基本類型都是scala中的,比如 Int 的全名是 scala.Int。
基本數(shù)據(jù)類型 | 描述 |
---|---|
Byte | 8位有符號(hào)補(bǔ)碼整數(shù)。數(shù)值區(qū)間為 [-27, 27-1] |
Short | 16位有符號(hào)補(bǔ)碼整數(shù)。數(shù)值區(qū)間為 [-215, 215-1] |
Int | 32位有符號(hào)補(bǔ)碼整數(shù)。數(shù)值區(qū)間為 [-231, 231-1] |
Long | 64位有符號(hào)補(bǔ)碼整數(shù)。數(shù)值區(qū)間為 [-263, 263-1] |
Float | 32 位, IEEE 754 標(biāo)準(zhǔn)的單精度浮點(diǎn)數(shù) |
Double | 64 位, IEEE 754 標(biāo)準(zhǔn)的雙精度浮點(diǎn)數(shù) |
Char | 16位無(wú)符號(hào)Unicode字符, 數(shù)值區(qū)間為 [0, 216-1] |
String | 字符序列 |
Boolean | true, false |
字面量分為整數(shù)字面量、浮點(diǎn)數(shù)字面量、布爾型字面量、字符及字符串字面量和Unit字面量。
val i = 1 //1就是整數(shù)字面量val i = 9.9 //9.9就是浮點(diǎn)數(shù)字面量val i = true //true就是布爾型字面量val i = 'A' //'A'就是字符字面量val i = "Hello World!" //"Hello World!"就是字符串字面量
Unit字面量只有一個(gè)唯一的值,表示為()。
Scala的操作符與Java的基本一致,但Scala的操作符實(shí)際上是方法,也就是說(shuō)操作符只是方法的另一種形式。
比如:5 + 4 等價(jià)于 5.+(4) ,實(shí)際上 “+” 是Int類里的一個(gè)方法。
對(duì)于基本類型的操作,scala還提供了許多常用的方法,這些方法被封裝在每個(gè)類對(duì)應(yīng)的富包裝類中,上文提到的九個(gè)基本類型都有其對(duì)應(yīng)的富包裝類,比如,Int類型對(duì)應(yīng)的富包裝類為RichInt類。
富包裝類位于包scala.runtime中,當(dāng)一個(gè)對(duì)象調(diào)用了富包裝類中的方法,scala會(huì)自動(dòng)通過(guò)隱式轉(zhuǎn)換將該對(duì)象轉(zhuǎn)換為富包裝類對(duì)象。
scala只有兩種類型的變量,用val和var來(lái)聲明。它們之間的區(qū)別在于:
val 聲明的變量不可變,val聲明時(shí)必須初始化變量,且初始化后不再賦新值;
var聲明的變量可變,即它可以被多次賦值。
val
val b:String = "hello" //聲明一個(gè)String類型的不可變變量 bval b = "hello" //與上式等同
var
var a:Int = 9 //聲明一個(gè)Int類型的可變變量 a
由于scala具有類型推斷機(jī)制,它會(huì)通過(guò)變量的值自動(dòng)推斷其數(shù)據(jù)類型,所以上面的語(yǔ)句也可以寫(xiě)成:
val a = 9
如果要把 a聲明為Double類型,那么就需要顯式定義:
val a:Double = 9
從控制臺(tái)輸入輸出
輸入
scala中提供了以read為前綴的許多方法,供不同類型的數(shù)據(jù)類型進(jìn)行輸入輸出,分別是readByte, readByte, readInt, readLong, readFloat, readDouble, readChar, readBoolean 以及readLine,這些方法都在scala的包io.StdIn中。
readLine對(duì)應(yīng)讀取String類型的數(shù)據(jù),可以不提供參數(shù),也可以提供一個(gè)字符串類型的參數(shù)作為輸入提示。
輸出
可以使用 print()方法或者println()向控制臺(tái)輸出,或者采用格式化輸出方法printf()。
文件的讀寫(xiě)
Java類庫(kù)java.io.PrintWriter實(shí)現(xiàn)文本文件的創(chuàng)建與寫(xiě)入。PrintWriter也提供了控制臺(tái)輸出方法 print()和println()。
Scala使用類scala.io.Source實(shí)現(xiàn)對(duì)文件的讀取,最常用的方法是getLines,它返回一個(gè)包含文件所有行的迭代器(Iterator)。
if 條件表達(dá)式
if結(jié)構(gòu)與Java的相同。比如:
val x = 3if (x=0) { println("1")} else if (x>0) { println("2")} else { println("3")}
while 循環(huán)
while循環(huán)的格式與Java中也完全相同。
val x = 10while (x>0) { println("hello")x-=1}
for 循環(huán)
這是一個(gè)很簡(jiǎn)單的for循環(huán)實(shí)例:
for (i <- 1 to 5) println(i)
它遍歷1到5的所有整數(shù)值并打印輸出,這里的語(yǔ)法跟Java中就不太一樣了。那么1 to 5
是什么呢?
現(xiàn)在我們運(yùn)行scala的REPL模式,輸入語(yǔ)句: 1 to 5
,得到的是一個(gè)Range類型的對(duì)象,它是一個(gè)序列,它可以表示為(1,2,3,4,5)。
scala> 1 to 5val res0: scala.collection.immutable.Range.Inclusive = Range 1 to 5
在執(zhí)行for循環(huán)時(shí),我們經(jīng)常會(huì)用到數(shù)值序列,比如,i的值從1循環(huán)到5,這時(shí)就可以采用Range來(lái)實(shí)現(xiàn)。Range可以支持創(chuàng)建不同數(shù)據(jù)類型的數(shù)值序列,包括Int、Long、Float、Double、Char、BigInt和BigDecimal等。
對(duì)循環(huán)的控制
scala中沒(méi)有Java中的break,continue關(guān)鍵字,因?yàn)?/p>
異常處理結(jié)構(gòu)
scala的異常處理不會(huì)像Java中那樣使用throw將異常拋出,它只使用try-catch結(jié)構(gòu)對(duì)異常進(jìn)行捕獲。這是因?yàn)閟cala中將所有異常都當(dāng)作非檢查型,不支持Java中的檢查型異常。
檢查型異常(Checked Exception)與非檢查型異常(Unchecked Exception)
檢查型異常(編譯期異常)就是編譯器檢查了你的代碼之后發(fā)現(xiàn)的異常,它強(qiáng)制開(kāi)發(fā)者必須處理這些異常之后才能通過(guò)編譯。Java中可以通過(guò)throw/throws/try-catch來(lái)處理這種異常。
非檢查型異常就是編譯器不強(qiáng)制檢查的那一類異常,Java中所有繼承自RuntimeException的異常都屬于非檢查型異常(運(yùn)行期異常),這種異常往往可以避免,也可以進(jìn)行異常處理。如果不進(jìn)行異常處理,那么如果有異常產(chǎn)生,則異常將由JVM進(jìn)行處理,這也會(huì)導(dǎo)致程序的執(zhí)行中斷。
Scala 語(yǔ)言中提供的數(shù)組是一種可變的、可索引的、元素具有相同類型的數(shù)據(jù)集合。數(shù)組一般包括定長(zhǎng)數(shù)組和變長(zhǎng)數(shù)組。
數(shù)組的實(shí)例化:
val intArr = new Array[Int](3) //長(zhǎng)度為3的Int型數(shù)組val strArr = Array("hello","world","!")
上面第2行的代碼也實(shí)例化了一個(gè)數(shù)組對(duì)象,實(shí)際上這里隱式調(diào)用了Array的伴生對(duì)象的apply方法(在之后的面向?qū)ο缶幊趟枷氩糠謺?huì)介紹)。
數(shù)組元素的賦值:
intArr(0) = 12intArr(1) = 1intArr(2) = 90
和Java不一樣的地方在于scala使用圓括號(hào)()
進(jìn)行元素的索引,而java使用的是方括號(hào)[]
。
scala元組和數(shù)組其實(shí)很相似,只不過(guò)元組中的元素可以是不同類型的,而數(shù)組中只能存儲(chǔ)相同類型的元素。
scala中提供了TupleN(N的范圍為1~22),用于創(chuàng)建一個(gè)包含N個(gè)元素的元組。
元組的好處在于:如果想要在方法里返回多個(gè)不同類型的對(duì)象,就可以將它們封裝在元組中,省去了重新定義一個(gè)類然后封裝返回值的步驟,元組是Java中不具有的。
元組的實(shí)例化:
val tuple = ("hello","world",123)
元素的訪問(wèn):
tuple._(1) //通過(guò) ._(索引) 的方式訪問(wèn)元素,索引從1開(kāi)始
以上代碼訪問(wèn)的元素為"hello"。
scala定義了容器庫(kù)(Collection),包含序列(Seq),映射(Map),集合(Set)等數(shù)據(jù)結(jié)構(gòu)。
scala用了三個(gè)包來(lái)組織不同類別的容器類,分別是 scala.collection ,scala.collection.mutable,scala.collection.immutable。
scala.collection.mutable
這個(gè)包中定義了元素可變的容器。
scala.collection.immutable
這個(gè)包中定義了元素不可變的容器。
scala.collection
這個(gè)包中定義了元素可變和元素不可變的容器的超類或特質(zhì) (相當(dāng)于Java的接口,將在面向?qū)ο缶幊滩糠纸榻B)。
容器的宏觀層級(jí)關(guān)系
?
?
Traverable特質(zhì)為所有容器定義了foreach抽象方法,具有Traverable特質(zhì)的容器必須實(shí)現(xiàn)foreach方法
Iterable特質(zhì)為所有容器定義了iterator抽象方法,具有Iterale特質(zhì)的容器必須實(shí)現(xiàn)iterator方法,返回一個(gè)迭代器(Iterator)
序列是指元素可以安按照特定的順序來(lái)訪問(wèn)的容器。所有類型的序列都具有collection.Seq 特質(zhì),包括了可變對(duì)象和不可變對(duì)象的抽象。
Seq中常用的實(shí)現(xiàn)如下圖:
列表 List
列表被定義在scala.collection.immutable 中,列表中的元素相同,一旦定義了就不能再改變。
因此,列表聲明時(shí)也需要初始化:
val alist = List("charge","free","sql") //不指定類型,由scala自行推斷val blist = List[Int](1,2,3) //指定List的元素類型
由于列表是一個(gè)特質(zhì),故聲明時(shí)不能使用new關(guān)鍵字,這里同樣隱式調(diào)用了List的工廠方法apply。
列表的常用方法:
head:返回列表的第一個(gè)元素
tail:返回列表中除了第一個(gè)元素以外的所有元素組成的新列表
包括List在內(nèi)的所有容器類型,若沒(méi)有顯式指定元素類型,scala會(huì)選擇所有初始值的最近公共類型來(lái)作為容器元素的類型,比如:
val cList = List("hello",3.14,22)cList的類型則被指定為Any (所有類的父類)。因?yàn)锳ny是String, Dounle和Int這三個(gè)類型的最近公共類型。
Vector
:+
:向序列的尾端添加元素
+:
:向序列的前端添加元素
?
+=與+:的區(qū)別:+=會(huì)修改當(dāng)前序列,+: 只是將序列修改后的結(jié)果賦給新的序列,對(duì)原序列不做修改。
?
List 和Vector的可變版本分別為 ListBuffer和ArrayBuffer,位于scala.collection.mutable中。
Range
Range是一個(gè)不可變數(shù)字等差數(shù)列。
集合中沒(méi)有重復(fù)的元素。集合包括可變集合和不可變集合,分別位于scala.collection.mutable 和scala.collection.immutable中。默認(rèn)情況下創(chuàng)建的是不可變集。
集合中的元素并不按插入順序排列,而是通過(guò)hash 的方法來(lái)組織元素。
映射中的元素是一個(gè)個(gè)的鍵值對(duì),在一個(gè)映射中只存在唯一的鍵。映射包括可變映射和不可變映射。
迭代器可以按順序訪問(wèn)容器元素。迭代器是“一次性”使用的,它不支持隨機(jī)訪問(wèn),只能按照從前往后的順序訪問(wèn)元素,每訪問(wèn)完一個(gè)元素就將其從迭代器中刪除,直至迭代器中沒(méi)有元素為止。所以在遍歷完所有元素后再次使用該迭代器就會(huì)報(bào)錯(cuò)。
常用方法 (與Java中相同):
next:用于返回迭代器的下一個(gè)元素
hasNext:用于判斷是否還有下一個(gè)元素
到此,相信大家對(duì)“Scala基礎(chǔ)知識(shí)有哪些”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。