Scala學(xué)習(xí)筆記(三)

Scala的基礎(chǔ)語(yǔ)法

繼上一篇的基礎(chǔ)語(yǔ)法之后,我又整理了一些個(gè)人學(xué)習(xí)過(guò)程中認(rèn)為比較重要的語(yǔ)法雷恃。

1. if/else 表達(dá)式

1.1 替代三目運(yùn)算符

先用 Java 來(lái)寫一段三目運(yùn)算符的代碼

int i = 10;
int j = i>5?i:5

Scala 由于沒(méi)有 Java 的三目運(yùn)算符(?:)匕争,不過(guò)好在可以用 if/else 表達(dá)式替代它葵擎。

scala> val i = 10
i: Int = 10

scala> val j = if (i>5) i else 5
j: Int = 10

上面的代碼胳蛮,還可以寫成

scala> val i = 10
i: Int = 10

scala> var j =0
j: Int = 0

scala> if (i>5) j = i else j=5

scala> println (j)
10

不過(guò)右核,這種寫法變量 j 需要定義成 var慧脱,因?yàn)?val 的變量一旦定義不能被改變略嫌麻煩 , 所以第一種寫法會(huì)更好。

1.2 混合類型表達(dá)式

scala> val i = 10
i: Int = 10

scala> val j = if (i>5) "String express" else 5
j: Any = String express

scala> println(j)
String express

一般三目運(yùn)算符肯定是返回同一種類型蒙兰,但是上述的代碼在 if 和 else 里既有String類型又有Int類型磷瘤。所以,返回的是兩個(gè)類型的公共超類型Any搜变。

2. 占位符_

Scala 可以把下劃線“_”當(dāng)做一個(gè)或多個(gè)參數(shù)的占位符,第一個(gè)下劃線代表第一個(gè)參數(shù)针炉,第二個(gè)下劃線代表第二個(gè)挠他,以此類推。只要每個(gè)參數(shù)在函數(shù)文本內(nèi)僅出現(xiàn)一次篡帕。

先看一段 Java 的代碼殖侵,它將集合的每個(gè)元素都乘以2再打印出來(lái)。

Integer[] arrays = {1,2,3,4,5};
List<Integer> list = Arrays.asList(arrays);
list.stream().map(it->it*2).forEach(System.out::println);

再用占位符來(lái)簡(jiǎn)化上述的 Java 代碼

scala> val list = Array(1,2,3,4,5)
list: Array[Int] = Array(1, 2, 3, 4, 5)

scala> list.map(_*2).foreach(println)
2
4
6
8
10

通過(guò)對(duì)比镰烧,顯然 Scala 的代碼更加簡(jiǎn)潔拢军。

再來(lái)一個(gè)例子:多個(gè)占位符

scala> val f1 = (x:Int,y:Int) => x+y
f1: (Int, Int) => Int = $$Lambda$1011/349978505@1706a5c9

scala> f1(1,2)
res0: Int = 3

用兩個(gè)占位符來(lái)簡(jiǎn)化上面的代碼。

scala> val f2 = (_:Int)+(_:Int)
f2: (Int, Int) => Int = $$Lambda$1034/74606989@7b7683d4

scala> f2(1,2)
res1: Int = 3

3. Array 怔鳖、 ArrayBuffer 以及多維數(shù)組

Scala 的數(shù)組包括定長(zhǎng)數(shù)組 Array茉唉,以及不定長(zhǎng)數(shù)組 ArrayBuffer。

3.1 Array

scala> val nums = new Array[Int](10) // 所有元素初始化為0
nums: Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

scala> val strings = new Array[String](10) // 所有元素初始化為null
strings: Array[String] = Array(null, null, null, null, null, null, null, null, null, null)
scala> val names = Array("tony", "cafei", "aaron")
names: Array[String] = Array(tony, cafei, aaron)

scala> names(0)
res2: String = tony

一旦初始化 Array ,只能修改 Array 中的元素度陆,不能增加或者刪除元素艾凯。

3.2 ArrayBuffer

ArrayBuffer類似 Java 中的ArrayList。它是數(shù)組緩沖懂傀。

scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer

scala> val arrayBuffer = new ArrayBuffer[Int]
arrayBuffer: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()

scala> arrayBuffer += 0
res7: arrayBuffer.type = ArrayBuffer(0)

scala> arrayBuffer += 1
res8: arrayBuffer.type = ArrayBuffer(0, 1)

scala> arrayBuffer += (2,3,4,5)
res9: arrayBuffer.type = ArrayBuffer(0, 1, 2, 3, 4, 5)

scala> arrayBuffer ++= Array(6,7,8,9,10) // 添加Array需要使用++
res10: arrayBuffer.type = ArrayBuffer(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> arrayBuffer.trimEnd(1) // 刪除最后一個(gè)元素

scala> println (arrayBuffer)
ArrayBuffer(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

ArrayBuffer 還支持在任意位置進(jìn)行添加(insert)和刪除(remove)操作

scala> arrayBuffer.insert(2,100) // 在下標(biāo)2處插入100

scala> println (arrayBuffer)
ArrayBuffer(0, 1, 100, 2, 3, 4, 5, 6, 7, 8, 9)

scala> arrayBuffer.insert(5,101,102) // 在下標(biāo)5處插入101,102

scala> println (arrayBuffer)
ArrayBuffer(0, 1, 100, 2, 3, 101, 102, 4, 5, 6, 7, 8, 9)

反之趾诗,ArrayBuffer 的 remove 操作是同理。

除此之外蹬蚁, ArrayBuffer 還有 sum恃泪、max、min犀斋、sorted 等常用函數(shù)贝乎。

ArrayBuffer 到 Array 的轉(zhuǎn)換: toArray

scala> arrayBuffer.toArray
res21: Array[Int] = Array(0, 1, 100, 2, 3, 101, 102, 4, 5, 6, 7, 8, 9)

3.3 多維數(shù)組

Scala 多維數(shù)組是通過(guò)數(shù)組的數(shù)組來(lái)實(shí)現(xiàn)的。二維數(shù)組看起來(lái)像是Array[Array[Int]]闪水。要構(gòu)造這樣一個(gè)數(shù)組糕非,可以用ofDim方法。

二維數(shù)組的定義

scala> val matrix=Array.ofDim[Int](3,4) 
matrix: Array[Array[Int]] = Array(Array(0, 0, 0, 0), Array(0, 0, 0, 0), Array(0, 0, 0, 0))

三維數(shù)組的定義

scala> val matrix2 = Array.ofDim[Int](3,4,5)
matrix2: Array[Array[Array[Int]]] = Array(Array(Array(0, 0, 0, 0, 0), Array(0, 0, 0, 0, 0), Array(0, 0, 0, 0, 0), Array(0, 0, 0, 0, 0)), Array(Array(0, 0, 0, 0, 0), Array(0, 0, 0, 0, 0), Array(0, 0, 0, 0, 0), Array(0, 0, 0, 0, 0)), Array(Array(0, 0, 0, 0, 0), Array(0, 0, 0, 0, 0), Array(0, 0, 0, 0, 0), Array(0, 0, 0, 0, 0)))

所以球榆,多維數(shù)組的定義:
Array.ofDim[類型](維度1, 維度2, 維度3,....)

4. 不可變Map 和 可變Map

4.1 不可變Map

不可變Map位于scala.collection.immutable包中朽肥。

假設(shè),我們定義某學(xué)生的期末考試分?jǐn)?shù)持钉,它是一個(gè)不可改變的Map集合衡招。

scala> val scores = Map("math"->90,"english"->85,"chinese"->80)
scores: scala.collection.immutable.Map[String,Int] = Map(math -> 90, english -> 85, chinese -> 80)

獲取該學(xué)生的數(shù)學(xué)成績(jī)

scala> scores("math")
res8: Int = 90

獲取該學(xué)生的計(jì)算機(jī)成績(jī),其實(shí)并沒(méi)有錄入計(jì)算機(jī)課程的分?jǐn)?shù)會(huì)出現(xiàn)什么情況呢?

scala> scores("computer")
java.util.NoSuchElementException: key not found: computer
  at scala.collection.immutable.Map$Map3.apply(Map.scala:156)
  ... 30 elided

不出意外地報(bào)了一個(gè)錯(cuò)誤每强。
所以始腾,我們得先判斷一下map里是否包含計(jì)算機(jī)課程,包含的話就取出成績(jī)空执,不包含的話只能默認(rèn)0分根暑,這樣代碼才安全苹丸。

scala> val computer = if (scores.contains("computer")) scores("computer") else 0
computer: Int = 0

這下,命令行就不會(huì)報(bào)錯(cuò)了。

4.2 可變Map

可變Map位于scala.collection.mutable包中伍伤。
對(duì)于剛才的情況冀瓦,添加該學(xué)生計(jì)算機(jī)的成績(jī)默勾。

scala> scores +=("computer"->88)
<console>:13: error: value += is not a member of scala.collection.immutable.Map[String,Int]
       scores +=("computer"->88)

scala是會(huì)報(bào)錯(cuò)的番电,因?yàn)閟cores是不可變map。

重新定義scores默蚌,讓它變成可變的map冻晤,這樣就可以添加其他課程的成績(jī)了。

scala> val scores = scala.collection.mutable.Map("math"->90,"english"->85,"chinese"->80)
scores: scala.collection.mutable.Map[String,Int] = Map(chinese -> 80, math -> 90, english -> 85)

scala> scores +=("computer"->88)
res12: scores.type = Map(computer -> 88, chinese -> 80, math -> 90, english -> 85)

換一個(gè)角度绸吸,我們來(lái)看看如何定義一個(gè)空的Map


scala> val map=new scala.collection.mutable.HashMap[String,Int]()
map: scala.collection.mutable.HashMap[String,Int] = Map()

scala> map += ("computer"->88)
res15: map.type = Map(computer -> 88)

scala> map +=  ("math"->90,"english"->85,"chinese"->80)
res16: map.type = Map(computer -> 88, chinese -> 80, math -> 90, english -> 85)

scala> println (map)
Map(computer -> 88, chinese -> 80, math -> 90, english -> 85)

scala> map.getClass
res18: Class[_ <: scala.collection.mutable.HashMap[String,Int]] = class scala.collection.mutable.HashMap

未來(lái)鼻弧,我會(huì)單獨(dú)再整理一篇集合相關(guān)的文章设江。

5. 元組

元組(Tuple)是不同類型的值的聚集。

定義一個(gè)元組:

scala> val tuple = (0,false,"Scala")
tuple: (Int, Boolean, String) = (0,false,Scala)

然后我們可以用方法_1温数、_2绣硝、_3訪問(wèn)其元素。

scala> println(tuple._1) // 打印第一個(gè)元素
0

scala> println(tuple._2) // 打印第二個(gè)元素
false

scala> println(tuple._3) // 打印第三個(gè)元素
Scala

值得注意的是撑刺,元組的索引是從1開(kāi)始鹉胖,而數(shù)組的索引是從0開(kāi)始。

通常够傍,使用模式匹配來(lái)獲取元組的元素甫菠。

scala> val (first, second, third)=tuple
first: Int = 0
second: Boolean = false
third: String = Scala

如果并不是所有的元素都需要,那么可以在不需要的元素位置上使用占位符_:

scala> val (first, second, _ ) = tuple
first: Int = 0
second: Boolean = false

總結(jié)

這篇筆記還是整理一些基礎(chǔ)的知識(shí)冕屯。

下一篇開(kāi)始寂诱,我會(huì)整理 Scala 的類相關(guān)的內(nèi)容。

先前的文章:
Scala學(xué)習(xí)筆記(二)
Scala學(xué)習(xí)筆記(一)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末安聘,一起剝皮案震驚了整個(gè)濱河市痰洒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌浴韭,老刑警劉巖丘喻,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異念颈,居然都是意外死亡泉粉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門榴芳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嗡靡,“玉大人,你說(shuō)我怎么就攤上這事窟感√直耍” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵柿祈,是天一觀的道長(zhǎng)点骑。 經(jīng)常有香客問(wèn)我,道長(zhǎng)谍夭,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任憨募,我火速辦了婚禮紧索,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘菜谣。我一直安慰自己珠漂,他們只是感情好晚缩,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著媳危,像睡著了一般荞彼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上待笑,一...
    開(kāi)封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天鸣皂,我揣著相機(jī)與錄音,去河邊找鬼暮蹂。 笑死寞缝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仰泻。 我是一名探鬼主播荆陆,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼集侯!你這毒婦竟也來(lái)了被啼?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤棠枉,失蹤者是張志新(化名)和其女友劉穎浓体,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體术健,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汹碱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荞估。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咳促。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖勘伺,靈堂內(nèi)的尸體忽然破棺而出跪腹,到底是詐尸還是另有隱情,我是刑警寧澤飞醉,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布冲茸,位于F島的核電站,受9級(jí)特大地震影響缅帘,放射性物質(zhì)發(fā)生泄漏轴术。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一钦无、第九天 我趴在偏房一處隱蔽的房頂上張望逗栽。 院中可真熱鬧,春花似錦失暂、人聲如沸彼宠。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凭峡。三九已至拙已,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間摧冀,已是汗流浹背倍踪。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留按价,地道東北人惭适。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像楼镐,于是被迫代替她去往敵國(guó)和親癞志。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • scala學(xué)習(xí)筆記 第2章 變量和數(shù)據(jù)類型 基本數(shù)據(jù) scala的核心數(shù)據(jù)為四種 :字面量框产、值凄杯、變量、類型 值使...
    485b1aca799e閱讀 2,113評(píng)論 0 1
  • 數(shù)組 :new Array[Int](8)與Array[Int](8)的區(qū)別:第一種8個(gè)元素秉宿,第二個(gè)定義一個(gè)值為8...
    夙夜M閱讀 1,752評(píng)論 1 2
  • Array //聲明變量arr為Array整數(shù)類型的數(shù)組,包含5個(gè)元素忱叭。 scala>valarr=newArra...
    flyskyzyl閱讀 5,656評(píng)論 0 4
  • Scala的集合類可以從三個(gè)維度進(jìn)行切分: 可變與不可變集合(Immutable and mutable coll...
    時(shí)待吾閱讀 5,802評(píng)論 0 4
  • 瀏覽器內(nèi)核可以分為渲染引擎和js引擎隔崎。取得網(wǎng)頁(yè)內(nèi)容,整理訊息韵丑,計(jì)算網(wǎng)頁(yè)顯示方式爵卒。所有網(wǎng)頁(yè)瀏覽器、電子郵件客戶端以及...
    shoutinggg閱讀 444評(píng)論 0 0