溫馨提示×

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

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

Scala入門之List使用詳解

發(fā)布時(shí)間:2020-10-17 01:33:52 來(lái)源:腳本之家 閱讀:338 作者:小破孩 欄目:編程語(yǔ)言

Scala中使用List

Scala是函數(shù)式風(fēng)格與面向?qū)ο蠊泊娴木幊陶Z(yǔ)言,方法不應(yīng)該有副作用是函數(shù)風(fēng)格編程的一個(gè)重要的理念。方法唯一的效果應(yīng)該是計(jì)算并返回值,用這種方式工作的好處就是方法之間很少糾纏在一起,因此就更加可靠和可重用。另一個(gè)好處(靜態(tài)類型語(yǔ)言)是傳入傳出方法的所有東西都被類型檢查器檢查,因此邏輯錯(cuò)誤會(huì)更有可能把自己表現(xiàn)為類型錯(cuò)誤。把這個(gè)函數(shù)式編程的哲學(xué)應(yīng)用到對(duì)象世界里以為著使對(duì)象不可變。

前面一章介紹的Array數(shù)組是一個(gè)所有對(duì)象都共享相同類型的可變序列。比方說(shuō)Array[String]僅包含String。盡管實(shí)例化之后你無(wú)法改變Array的長(zhǎng)度。因此,Array是可變的對(duì)象。
說(shuō)到共享相同類型的不可變對(duì)象類型,Scala的List類才是。和數(shù)組一樣,List[String]包含的僅僅是String。Scala的List不同于Java的java.util.List,總是不可變的(Java的List是可變)。更準(zhǔn)確的說(shuō)法,Scala的List是設(shè)計(jì)給函數(shù)式風(fēng)格的編程用的。

(1)List類型定義以及List的特點(diǎn):

//字符串類型List
scala> val fruit=List("Apple","Banana","Orange")
fruit: List[String] = List(Apple, Banana, Orange)

//前一個(gè)語(yǔ)句與下面語(yǔ)句等同
scala> val fruit=List.apply("Apple","Banana","Orange")
fruit: List[String] = List(Apple, Banana, Orange)

//數(shù)值類型List
scala> val nums=List(1,2,3,4,5)
nums: List[Int] = List(1, 2, 3, 4, 5)

//多重List,List的子元素為L(zhǎng)ist
scala> val list = List(List(1, 2, 3), List("adfa", "asdfa", "asdf"))
list: List[List[Any]] = List(List(1, 2, 3), List(adfa, asdfa, asdf))

//遍歷List
scala> for(i <- list; from=i; j<-from)println(j)
1
2
3
adfa
asdfa
asdf

(2)List與Array的區(qū)別:

1、List一旦創(chuàng)建,已有元素的值不能改變,可以使用添加元素或刪除元素生成一個(gè)新的集合返回。
如前面的nums,改變其值的話,編譯器就會(huì)報(bào)錯(cuò)。而Array就可以成功

scala>nums(3)=4
<console>:10: error: value update is not a member of List[Int]
       nums(3)=4
       ^

2、List具有遞歸結(jié)構(gòu)(Recursive Structure),例如鏈表結(jié)構(gòu)

List類型和氣他類型集合一樣,它具有協(xié)變性(Covariant),即對(duì)于類型S和T,如果S是T的子類型,則List[S]也是List[T]的子類型。
例如:

scala>var listStr:List[Object] = List("This", "Is", "Covariant", "Example")
listStr:List[Object] = List(This, Is, Covariant, Example)

//空的List,其類行為Nothing,Nothing在Scala的繼承層次中的最底層
//,即Nothing是任何Scala其它類型如String,Object等的子類
scala> var listStr = List()
listStr:List[Nothing] = List()

scala>var listStr:List[String] = List()
listStr:List[String] = List()

(3)List常用構(gòu)造方法

//1、常用::及Nil進(jìn)行列表構(gòu)建
scala> val nums = 1 :: (2:: (3:: (4 :: Nil)))
nums: List[Int] = List(1, 2, 3, 4)


//由于::操作符的優(yōu)先級(jí)是從右向左的,因此上一條語(yǔ)句等同于下面這條語(yǔ)句
scala> val nums = 1::2::3::4::Nil
nums:List[Int] = List(1, 2, 3, 4)
至于::操作符的使用將在下面介紹

(4)List常用操作

//判斷是否為空
scala> nums.isEmpty
res5: Boolean = false

//取第一個(gè)元素
scala> nums.head
res6: Int = 1

//取列表第二個(gè)元素
scala>nums.tail.head
res7: Int = 2

//取第三個(gè)元素
scala>nums.tail.tail.head
res8: Int = 3

//插入操作
//在第二個(gè)位置插入一個(gè)元素
scala>nums.head::(3::nums.tail)
res11: List[Int] = List(1, 3, 2, 3, 4)

scala> nums.head::(nums.tail.head::(4::nums.tail.tail))
res12: List[Int] = List(1, 2, 4, 3, 4)

//插入排序算法實(shí)現(xiàn)
def isort(xs: List[Int]):List[Int] = {
  if(xs.isEmpty) Nil
  else insert(xs.head, issort(xs.tail))
}

def insert(x:Int, xs:List[Int]):List[Int] = {
  if(xs.isEmpty || x <= xs.head) x::xs
  else xs.head :: insert(x, xs.tail)
}

//連接操作
scala>List(1, 2, 3):::List(4, 5, 6)
res13: List[Int] = List(1, 2, 3, 4, 5, 6)

//去除最后一個(gè)元素外的元素,返回的是列表
scala> nums.init
res13: List[Int] = List(1, 2, 3)

//取出列表最后一個(gè)元素
scala>nums.last
res14: Int = 4

//列表元素倒置
scala> nums.reverse
res15: List[Int] = List(4, 3, 2, 1)

//一些好玩的方法調(diào)用
scala> nums.reverse.reverse == nums


//丟棄前面n個(gè)元素
scala>nums drop 3
res16: List[Int] = List(4)

//獲取前面n個(gè)元素
scala>nums take 1
res17: List[Int] = List[1]

//將列表進(jìn)行分割
scala> nums.splitAt(2)
res18: (List[Int], List[Int]) = (List(1, 2),List(3, 4))

//前一個(gè)操作與下列語(yǔ)句等同
scala> (nums.take(2),nums.drop(2))
res19: (List[Int], List[Int]) = (List(1, 2),List(3, 4))

//Zip操作
scala> val nums=List(1,2,3,4)
nums: List[Int] = List(1, 2, 3, 4)

scala> val chars=List('1','2','3','4')
chars: List[Char] = List(1, 2, 3, 4)

//返回的是List類型的元組(Tuple),返回的元素個(gè)數(shù)與最小的List集合的元素個(gè)數(shù)一樣
scala> nums zip chars
res20: List[(Int, Char)] = List((1,1), (2,2), (3,3), (4,4))

//List toString方法
scala> nums.toString
res21: String = List(1, 2, 3, 4)

//List mkString方法
scala> nums.mkString
res22: String = 1234

//轉(zhuǎn)換成數(shù)組
scala> nums.toArray
res23: Array[Int] = Array(1, 2, 3, 4)

(5)List伴生對(duì)象方法

//apply方法
scala> List.apply(1, 2, 3)
res24: List[Int] = List(1, 2, 3)

//range方法,構(gòu)建某一值范圍內(nèi)的List
scala> List.range(2, 6)
res25: List[Int] = List(2, 3, 4, 5)

//步長(zhǎng)為2
scala> List.range(2, 6,2)
res26: List[Int] = List(2, 4)

//步長(zhǎng)為-1
scala> List.range(2, 6,-1)
res27: List[Int] = List()

scala> List.range(6,2 ,-1)
res28: List[Int] = List(6, 5, 4, 3)

//構(gòu)建相同元素的List
scala> List.make(5, "hey")
res29: List[String] = List(hey, hey, hey, hey, hey)

//unzip方法
scala> List.unzip(res20)
res30: (List[Int], List[Char]) = (List(1, 2, 3, 4),List(1, 2, 3, 4))

//list.flatten,將列表平滑成第一個(gè)無(wú)素
scala> val xss =
   | List(List('a', 'b'), List('c'), List('d', 'e'))
xss: List[List[Char]] = List(List(a, b), List(c), List(d, e))
scala> xss.flatten
res31: List[Char] = List(a, b, c, d, e)

//列表連接
scala> List.concat(List('a', 'b'), List('c'))
res32: List[Char] = List(a
, b, c)

(6)::和:::操作符介紹

List中常用'::',發(fā)音為"cons"。Cons把一個(gè)新元素組合到已有元素的最前端,然后返回結(jié)果List。

scala> val twoThree = List(2, 3)
scala> val oneTwoThree = 1 :: twoThree
scala> oneTwoThree
oneTwoThree: List[Int] = List(1, 2, 3)

上面表達(dá)式"1::twoThree"中,::是右操作數(shù),列表twoThree的方法??赡軙?huì)有疑惑。表達(dá)式怎么是右邊參數(shù)的方法,這是Scala語(yǔ)言的一個(gè)例外的情況:如果一個(gè)方法操作符標(biāo)注,如a * b,那么方法被左操作數(shù)調(diào)用,就像a.* (b)--除非方法名以冒號(hào)結(jié)尾。這種情況下,方法被右操作數(shù)調(diào)用。

List有個(gè)方法叫":::",用于實(shí)現(xiàn)疊加兩個(gè)列表。

scala> val one = List('A', 'B')
val one = List('A', 'B')
scala> val two = List('C', 'D')

scala> one:::two
res1: List[Char] = List(A, B, C, D)

下面是List的方法列表:

Scala入門之List使用詳解

Scala入門之List使用詳解

注意:

類List沒(méi)有提供append操作,因?yàn)殡S著列表變長(zhǎng)append的耗時(shí)將呈線性增長(zhǎng),而使用::做前綴則僅花費(fèi)常量時(shí)間。如果你想通過(guò)添加元素來(lái)構(gòu)造列表,你的選擇是把它們前綴進(jìn)去,當(dāng)你完成之后再調(diào)用reverse;或使用ListBuffer,一種提供append操作的可變列表,當(dāng)你完成之后調(diào)用toList。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問(wèn)一下細(xì)節(jié)
推薦閱讀:
  1. LayaAir之List
  2. Scala之繼承

免責(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