Scala資料型別的相關操作
//Scala為其基本型別提供了豐富的運算子。這些運算子實際上只是普通的一個很好的語法方法呼叫。
//例如,1 + 2實際上與(1).+(2)。換句話說,類Int包含一個名為+的方法,它接受一個Int和返回Int結果
val sum = 1+2
println("1 + 2:" + sum)
val sumMethod = (1).+(2)
println("(1).+(2):" + sumMethod)
//實際上,Int包含幾個帶有不同的過載+方法引數型別。
//例如,Int有另一個方法,也叫做+接受並返回一個Long。 如果將一個Long新增到Int,則使用此過載+方法將被呼叫
val suml = 1 + 2L
println("sum Long:" + suml)
//+符號是一個運算子 - 一個特定的中綴運算子。 操作者符號不僅限於類似+的方法,看起來像其他的操作符語言。
//您可以在運算子表示法中使用任何方法。 例如,class String有一個方法indexOf,它接受一個Char引數。
//該indexOf方法在字串中搜索指定的第一個匹配項character,如果找不到該字元,則返回其索引或-1。 您可以
//使用indexOf作為運算子
val str = "Hello,world"
println("str value:" + str)
val strIndex = str indexOf 'o'
println("str indexof:" + strIndex)
//String提供了一個過載的indexOf方法兩個引數,要搜尋的字元和索引開始
val strIndexOrver = str indexOf ('o',5)
println("str indexof兩個引數:" + strIndexOrver)
//在Scala中,運算子不是特殊的語言語法:任何方法都可以是一個操作。
//使方法成為操作符的方法就是如何使用它。當您編寫s.indexOf('o')時,indexOf不是運算子。
//但當你寫s indexOf 'o'時,indexOf是一個運算子,因為你在運算子表示法中使用它
//Scala還有另外兩個運算子表示法:字首和字尾。 在字首表示法中,您放置方法.例如,在呼叫方法的物件之前的名稱-7中的' - '。
//在後綴表示法中,您將該方法放在物件之後,用於例如,“7 toLong”中的“toLong”。
//與中綴運算子符號相反 - 運算子佔兩個運算元,一個在左邊,另一個在右字首和字尾操作符是一元的:它們只佔用一個運算元。
//在字首表示法中,運算元在操作員的右邊。 字首運算子的一些示例是-2.0,!found,和~0xFF。
//與中綴運算子一樣,這些字首運算子也是一種呼叫方法的簡便方法。 但是,在這種情況下,名稱該方法的“unary_”前置於操作符。
//例如,Scala將表示式-2.0轉換為方法呼叫“(2.0).unary_-”
val unaryBefore = -2.0
val unaryAfter = (2.0).unary_-
println("unaryBefore:" + unaryBefore)
println("unaryAfter:" + unaryAfter)
//唯一可用作字首運算子的識別符號是+, - ,!和〜。因此,如果您定義名為unary_!的方法,
//則可以呼叫該方法使用字首運算子表示法在適當型別的值或變數上,比如!p。
//但是如果你定義一個名為unary_ *的方法,你將無法做到使用字首運算子表示法,因為*不是四個識別符號之一可以用作字首運算子。
//您可以正常呼叫該方法,如在p.unary_ *中,但是如果你試圖通過*p呼叫它,Scala會將其解析為如果你寫了*.p,這可能不是你的想法!4
//Postfix運算子是在沒有點或括號的情況下呼叫它們時不帶引數的方法。
//在Scala中,您可以在方法呼叫上留下空括號。 慣例是你包括圓括號方法有副作用,例如println(),但是你可以將它們關閉該方法沒有副作用
val strtest = "Hello,World"
println("strtest:" + strtest)
println("strtest.toLowerCase:" + strtest.toLowerCase)
println("strtest toLowerCase:" + strtest toLowerCase)
//如果你真的想要IEEE 754的餘數,你可以呼叫scala.math上的IEEEremainder
println("math.IEEEremainder:" + math.IEEEremainder(11.0,4.0))
// 數字型別還提供一元字首運算子+(方法unary_ +)和 - (方法unary_-),
//它們允許您指示正數或負數,如-3或+4.0。 如果未指定一元+或 - ,則將文字數字解釋為正數。
//一元+僅存在與一元對稱的對稱 - 但沒有效果。 一元 - 也可用於否定變數
val neg = 1 + -3
println("neg = 1 + -3:" + neg)
val y = +3
println("y=+3:" + y)
println("-neg:" + -neg)
//相關的比較操作符 > < >= <= = ,這個java中的一樣,也和其他的語言一樣
//||和&&操作符
val toTrue = true
val question = toTrue || !toTrue
println("question ||:" + question)
val paradox = toTrue && !toTrue
println("paradox &&:" + paradox)
//定義一個方法
def salt() = {println("salt"); false}
def pepper() = {println("pepper"); true}
println(salt())
println(pepper())
val result = salt() && pepper()
println("result:" + result)
//scala中的位運算
//按位和1(0001)和2(0010)中的每個位,產生0(0000),合併0/1變為0 1/1為1
println("1&2:" + (1 & 2))
//按位或操作(0001)和2(0010)中的每一位,產生3(0011) 合併 0/0 為0 0/1為1 1/1為1
println("1 | 2:" + (1 | 2))
//按位1(0001)和3(0011)中的每個位,產生2(0010)合併 0/0 為0 0/1為1 1/1為0
println("1^3:" + (1 ^ 3))
//反轉1(0001)中的每一位,得到-2 變為1110
println("~1:" + (~1))
//scala中還提供了三個位移操作符 左移(<<),右移(>>),無符號右移(>>>)
//移位方法在中綴操作符表示法中使用時,將操作符左邊的整數值移位為右邊的整數值指定的值。
//左移和無符號右移移動時填充0。右移在左移時用左值的最高位(符號位)填充
//二進位制中的-1是11111111111111111111111111111111
println("-1 >> 31:" + (-1 >> 31)) //-1被移位到右邊的31位位置。 由於Int由32位組成,因此該操作有效地移動最左邊的位直到它成為最右邊的位。由於>>方法向右移動時填充1,因為-1的最左位是1,結果是 與原始左運算元相同,32位,或-1
println("-1 >>> 31:" + (-1 >>> 31)) //最左邊的位再次向右移動直到它處於最右邊的位置,但這次沿著路徑填充零。 因此這次的結果是二進位制00000000000000000000000000000001,或1.
println("1 << 2:" + (1 << 2)) //左運算元1,左移兩個位置(用零填充),產生二進位制00000000000000000000000000000100,或4
//scala中的物件比較 使用 == 或者 !=
println("1==2:" + (1 == 2))
println("1 != 2:" + (1 != 2))
println("2==2:" + (2 == 2))
println("List(1,2,3) == List(1,2,3):" + (List(1,2,3) == List(1,2,3)))
println("List(1,2,3) == List('a','s','f'):" + (List(1,2,3) == List('a','s','f')))
println("List(1,2,3) == hello:" + (List(1,2,3) == "hello"))
println("1 == 1.0: " + (1 == 1.0))
println("List(1,2,3) == null:" + (List(1,2,3) == null))
println("null == List(1,2,3):" + (null == List(1,2,3)))
//==是經過精心設計的,以便您在大多數情況下得到您想要的相等比較。
//這是通過一個非常簡單的規則實現的:首先檢查左側是否為null,如果不是null,則呼叫equals方法,因為equals是一種方法,所以您得到的精確比較取決於左邊引數的型別。由於存在自動null檢查,您不必親自檢查
//Scala ==與Java的不同之處在Java中,您可以使用==來比較原始型別和引用型別。 在原始型別上,Java's ==比較值相等,就像在Scala中一樣。
//但是,在引用型別上,Java的==比較引用相等性,這意味著兩個變數指向JVM堆上的同一個物件。
//Scala提供了一個用於比較引用相等性的工具,名稱為eq。 但是,eq及其相反的ne僅適用於直接對映到Java物件的物件
操作符的優先順序見下圖:
還有一些相關操作:
相關的類: