Scala從零起步:運算符
導讀
繼續(xù)Scala從零起步系列,在前文分享變量和標識符的基礎(chǔ)上,本文介紹Scala中的運算符。簡單地說,Scala中的運算符和其他編程語言中的運算符并無太大區(qū)別,更多都是相同或者相近的,但是出于系列文章的內(nèi)容完整性,仍然單開此文對其予以介紹。

如同多數(shù)編程語言中的那樣,Scala中的運算符可概括為:
數(shù)學運算符
關(guān)系運算符
邏輯運算符
位運算符
特殊運算符
數(shù)學運算符是最為常規(guī)和常用的運算符,主要包括四則運算以及模余共5類運算,運算符表達方式也與其他編程語言保持一致:分別采取+、-、*、/、%來表示。唯一值得一提的是除法運算中,如果分子分母均為整數(shù),則結(jié)果仍然保留整數(shù),只有當分子和分母中有小數(shù)參與時才得到通常意義下的商。
scala> 5 / 2val res0: Int = 2scala> 1.0 * 5 / 2val res1: Double = 2.5
也如同其他編程語言中的關(guān)系運算符那樣,Scala中的關(guān)系運算符主要包括6類:>、>=、<、<=、==、!=。其中大于和小于類的4個運算符屬于常規(guī)運算符,除了可用于比較數(shù)值類大小外,也可用于比較字符串大小。同時需要注意==和!=兩個運算符,判斷兩個對象是否相等的底層邏輯有些許區(qū)別:當調(diào)用運算符的對象為null時,底層調(diào)用eq方法,否則調(diào)用equals方法。這里eq方法和equals方法的區(qū)別在于前者判斷引用是否相等,而后者僅判斷字面值是否相等。
scala>?"AB"?>?"AA"??//?>也適用于字符串比較val res2: Boolean = truescala> val s = "string"val s: String = stringscala> s == s+"" // s非空,所以調(diào)用equals方法,判斷值相等val res3: Boolean = truescala>?s.equals(s+"")??// 判斷值相等val res4: Boolean = truescala>?s.eq(s+"")??//判斷引用相等,由于此時s+""對應(yīng)新的地址,所以不等val res5: Boolean = false
Scala中的邏輯運算符基本保持了C和Java中的風格,即分別用&&、||以及!表達與或非。其中與或非具有短路特性,即已經(jīng)可以判斷出最終結(jié)果時則不再判斷后續(xù)表達式。
scala> val i = 0val i: Int = 0scala> if(i!=0 && 3/i>1) "a" else "b" // 避免除數(shù)為0引發(fā)異常val res6: String = b
位運算符是整數(shù)特有的運算操作符,Scala中主要包括6類7個運算符:分別是按位與、按位或、按位異或、按位取反以及左移位符和右移位符,其中前5類運算符依次用&、|、^、~、<<表示,而右移位符因其特殊性,又細分為>>和>>>兩種右移位符,其中前者是保留符號右移,而后者則是無符號右移位,即右移之后順序填充0,所以可能將負數(shù)通過右移變?yōu)檎龜?shù)。
scala> -1 << 1val?res7:?Int?=?-2scala> -1 >> 1val res8: Int = -1scala> -1 >>> 1val?res9:?Int?=?2147483647
前面4類運算符大多較為中規(guī)中矩,與其他編程語言中的相應(yīng)運算符差別不大,自然也比較好理解。下面介紹Scala中的幾個特殊運算符(嚴格來講也可不稱之為運算符,或許叫做方法更為嚴謹),非常具有Scala特色:
:,即英文冒號(一般讀作cons,代表連接的意思),適用于數(shù)組Array和列表List的連接操作。在Scala中,但凡以:結(jié)尾的運算符,那么都是右操作數(shù)的運算符,即應(yīng):右側(cè)的操作數(shù)為基準進行相應(yīng)計算。較為常見的包括4個:即:+、+:、::、:::,其相應(yīng)含義如下:
scala> val list = List(1, 2)val list: List[Int] = List(1, 2)scala>?list?:+?3??//?在列表右端連接新的元素val res10: List[Int] = List(1, 2, 3)scala>?3?+:?list?// 在列表左端連接新的元素val res11: List[Int] = List(3, 1, 2)scala> 3 :: list // 在列表左端連接新的元素val res12: List[Int] = List(3, 1, 2)scala>?list?:::?List(3)??//?兩個列表元素進行拼接val res13: List[Int] = List(1, 2, 3)
->:字典映射運算符,即用于構(gòu)造字典key-value的映射關(guān)系。更進一步地,由于Scala中的字典元素本質(zhì)上是一個二元組,所以由->連接的兩個值也會被解釋器理解為tuple2
scala> val map = Map("a"->1, "b"->2)val map: scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 2)scala> 1->2val res14: (Int, Int) = (1,2)
<-:迭代賦值運算符,類似于Python中in的作用,一般用于將<-右側(cè)的可迭代對象逐元素賦予左側(cè)的變量,從而完成循環(huán)遍歷,配合for使用尤為好用
scala> for(i <- List.range(1, 5)) println(i)1234
=>,定義函數(shù)映射。主要用在定義函數(shù)過程中,銜接參數(shù)列表與函數(shù)體之間的符號,表示映射關(guān)系。理論上不屬于運算符,但仍在此處加以提及。


相關(guān)閱讀:
