溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Scala基礎(chǔ)知識(shí)有哪些

發(fā)布時(shí)間:2021-12-08 14:43:26 來(lái)源:億速云 閱讀:126 作者:iii 欄目:大數(shù)據(jù)

本篇內(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)

1 基礎(chǔ)知識(shí)

基本數(shù)據(jù)類型

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ù)類型描述
Byte8位有符號(hào)補(bǔ)碼整數(shù)。數(shù)值區(qū)間為 [-27, 27-1]
Short16位有符號(hào)補(bǔ)碼整數(shù)。數(shù)值區(qū)間為 [-215, 215-1]
Int32位有符號(hào)補(bǔ)碼整數(shù)。數(shù)值區(qū)間為 [-231, 231-1]
Long64位有符號(hào)補(bǔ)碼整數(shù)。數(shù)值區(qū)間為 [-263, 263-1]
Float32 位, IEEE 754 標(biāo)準(zhǔn)的單精度浮點(diǎn)數(shù)
Double64 位, IEEE 754 標(biāo)準(zhǔn)的雙精度浮點(diǎn)數(shù)
Char16位無(wú)符號(hào)Unicode字符, 數(shù)值區(qū)間為 [0, 216-1]
String字符序列
Booleantrue, 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


輸入/輸出 (I/O)

  • 從控制臺(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)。

控制結(jié)構(gòu)

  1. if 條件表達(dá)式

    if結(jié)構(gòu)與Java的相同。比如:

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


  2. while 循環(huán)

    while循環(huán)的格式與Java中也完全相同。

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


  3. 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等。

  4. 對(duì)循環(huán)的控制

    scala中沒(méi)有Java中的break,continue關(guān)鍵字,因?yàn)?/p>

  5. 異常處理結(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í)行中斷。

數(shù)據(jù)結(jié)構(gòu)

數(shù)組 Array

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)[]。

元組 Tuple

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"。

容器 Collection

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)系
?
Scala基礎(chǔ)知識(shí)有哪些

?

  • 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)如下圖:

Scala基礎(chǔ)知識(shí)有哪些

  • 列表 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。

    列表的常用方法:

    1. head:返回列表的第一個(gè)元素

    2. 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

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

  2. +::向序列的前端添加元素
    ?
    +=與+:的區(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è)映射中只存在唯一的鍵。映射包括可變映射和不可變映射。

迭代器 Iterator

迭代器可以按順序訪問(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í)!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI