本章將介紹Scala中的字符串。 在Scala中的字符串和Java中的一樣,字符串是一個不可變的對象,也就是一個不能修改的對象??梢孕薷牡膶ο?,如數(shù)組,稱為可變對象。字符串是非常有用的對象,在本節(jié)的最后部分,我們將介紹java.lang.String類的一些重要方法。
以下是創(chuàng)建一個字符串的代碼 -
var greeting = "Hello world!";
// 或者
var greeting:String = "Hello world!";
每當編譯器在代碼中遇到一個字符串文字時,它會創(chuàng)建一個帶有它的值的String對象,在這種情況下是“Hello world!”。String關(guān)鍵字也可以在如上所示的第二個聲明中給出。
請嘗試以下示例程序。
object Demo {
val greeting: String = "Hello, world!"
def main(args: Array[String]) {
println( greeting )
}
}
將上述程序保存在源文件:Demo.scala中,使用以下命令編譯和執(zhí)行此程序。
D:\> scalac Demo.scala
D:\> scala Demo
Hello, world!
如前所述,String類是不可變的。創(chuàng)建后的String對象是無法更改的。如果有必要對字符串進行大量修改,那么可考慮使用Scala中提供的StringBuilder類。
用于獲取有關(guān)對象的信息的方法稱為訪問器方法。一個可以與字符串一起使用的訪問器方法是length()方法,它返回字符串對象中包含的字符數(shù)。
使用以下代碼段來查找字符串的長度 -
例子
object Demo {
def main(args: Array[String]) {
var palindrome = "Dot saw I was Tod";
var len = palindrome.length();
println( "String Length is : " + len );
}
}
將上述程序保存在源文件:Demo.scala中,使用以下命令編譯和執(zhí)行此程序。
$ scalac Demo.scala
$ scala Demo
String Length is : 17
String類包括一個連接兩個字符串的方法 -
string1.concat(string2);
這將返回一個新的字符串,字符串string1的尾部添加字符串string2。您也可以使用concat()方法在字符串文字上操作,如下 -
"My name is ".concat("Zara");
字符串通常還使用+運算符連接,如 -
"Hello," + " world" + "!"
這將產(chǎn)生以下結(jié)果 -
"Hello, world!"
以下代碼行將兩個字符串相連接 -
object Demo {
def main(args: Array[String]) {
var str1 = "Dot saw I was ";
var str2 = "Tod";
println("Dot " + str1 + str2);
}
}
將上述程序保存在源文件:Demo.scala中,使用以下命令編譯和執(zhí)行此程序。
D:\>scalac Demo.scala
D:\>scala Demo
Dot Dot saw I was Tod
您可以使用printf()和format()方法打印具有格式化數(shù)字或字符串的輸出。 String類具有format()方法,它返回String對象而不是PrintStream對象。
嘗試以下示例程序,它使用printf()方法 -
示例
object Demo {
def main(args: Array[String]) {
var floatVar = 12.456
var intVar = 2000
var stringVar = "Hello, Scala!"
var fs = printf("The value of the float variable is " + "%f, while the value of the integer " + "variable is %d, and the string" + "is %s", floatVar, intVar, stringVar);
println(fs)
}
}
將上述程序保存在源文件:Demo.scala中,以下命令用于編譯和執(zhí)行此程序。
D:\>scalac Demo.scala
D:\>scala Demo
The value of the float variable is 12.456000,
while the value of the integer variable is 2000,
and the string is Hello, Scala!()
字符串插值是使用Scala編程語言創(chuàng)建字符串的新方法。此功能支持只在Scala-2.10及更高版本。字符串插值:直接在過程字符串文字中嵌入變量引用的機制。
字符串插值中有三種類型(插值器)實現(xiàn)。
文字's'允許在處理字符串時直接使用變量。任何在范圍中的String變量可以在字符串中使用。以下是's'字符串插值器的不同用法。
在println語句中將String變量($name)附加到普通字符串(Hello)中,以下示例代碼片段用于實現(xiàn)'s'插值器。
val name = “James”
println(s “Hello, $name”) //output: Hello, James
字符串插入器還可以處理任意表達式。 使用's'字符串插入器處理具有任意表達式(${1 + 1})的字符串(1 + 1)的以下代碼片段。任何表達式都可以嵌入到${}中。
println(s “1 + 1 = ${1 + 1}”) //output: 1 + 1 = 2
嘗試實現(xiàn)'s'插值器的示例程序如下 -
object Demo {
def main(args: Array[String]) {
val name = "James"
println(s"Hello, $name")
println(s"1 + 1 = ${1 + 1}")
}
}
將上述程序保存在源文件:Demo.scala中,使用以下命令編譯和執(zhí)行此程序。
D:\>scalac Demo.scala
D:\>scala Demo
Hello, James
1 + 1 = 2
文字'f'插值器允許創(chuàng)建一個格式化的字符串,類似于C語言中的printf。 在使用'f'插值器時,所有變量引用都應(yīng)該是printf樣式格式說明符,如%d,%i,%f等。
我們以一般的字符串為例附加浮點值(height = 1.9d)和字符串變量(name =“James”)。下面的代碼片段實現(xiàn)'f'插值器。這里$name%s打印String變量James和$height%2.2f打印浮點值1.90。
val height = 1.9d
val name = "James"
println(f"$name%s is $height%2.2f meters tall") //James is 1.90 meters tall
它是類型安全的變量引用,以下格式說明符要匹配,否則顯示錯誤。'f'插值器使用Java中可用String格式實用程序(格式說明符)。 默認情況下,變量引用后沒有%字符。它將假定為%s的字符串。
'raw'內(nèi)插器類似于's'插值器,除了它不執(zhí)行字符串內(nèi)的文字轉(zhuǎn)義。下表中的代碼段將區(qū)別's'和'raw'插值器的用法。 在使用s和\n效果的輸出中,新行作為原始值輸出,也就是\n將不起作用。它將使用轉(zhuǎn)義字母打印完整的字符串。
's'的插值器使用,程序代碼如下 -
object Demo {
def main(args: Array[String]) {
println(s"Result = \n a \n b")
}
}
輸出結(jié)果 -
Result =
a
b
'raw'的插值器使用,程序代碼如下 -
object Demo {
def main(args: Array[String]) {
println(raw"Result = \n a \n b")
}
}
輸出結(jié)果 -
Result = \n a \n b
以下是java.lang.String類定義的方法列表,可以直接在Scala程序中使用 -
| 編號 | 方法 | 描述 |
|---|---|---|
| 1 | char charAt(int index) | 返回指定索引處的字符。 |
| 2 | int compareTo(Object o) | 將此String與另一個對象進行比較。 |
| 3 | int compareTo(String anotherString) | 按字典順序比較兩個字符串。 |
| 4 | int compareToIgnoreCase(String str) | 按字典順序比較兩個字符串,忽略大小寫差異。 |
| 5 | String concat(String str) | 將指定的字符串連接到該字符串的末尾。 |
| 6 | boolean contentEquals(StringBuffer sb) | 當且僅當此String表示與指定的StringBuffer的字符序列相同時,才返回true。 |
| 7 | static String copyValueOf(char[] data) | 返回一個字符串,表示指定的數(shù)組中的字符序列。 |
| 8 | static String copyValueOf(char[] data, int offset, int count) | 返回一個字符串,表示指定的數(shù)組中的字符序列。 |
| 9 | boolean endsWith(String suffix) | 測試此字符串是否以指定的字符串為后綴/結(jié)尾。 |
| 10 | boolean equals(Object anObject) | 將此字符串與指定對象進行比較。 |
| 11 | boolean equalsIgnoreCase(String anotherString) | 將此String與另一個String進行比較,并忽略大小寫。 |
| 12 | byte getBytes() | 使用平臺的默認字符集將此String編碼為一系列字節(jié),將結(jié)果存儲到新的字節(jié)數(shù)組中。 |
| 13 | byte[] getBytes(String charsetName) | 使用命名的字符集將此String編碼為一系列字節(jié),將結(jié)果存儲到新的字節(jié)數(shù)組中。 |
| 14 | void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) | 將此字符串從srcBegin到srcEnd索引處的字符復(fù)制到目標字符數(shù)組(dst)中。 |
| 15 | int hashCode() | 返回此字符串的哈希碼。 |
| 16 | int indexOf(int ch) | 返回指定字符第一次在字符串中出現(xiàn)的索引。 |
| 17 | int indexOf(int ch, int fromIndex) | 返回指定字符以指定的索引開始搜索第一次在字符串內(nèi)出現(xiàn)的索引。 |
| 18 | int indexOf(String str) | 返回指定子字符串在字符串內(nèi)第一次出現(xiàn)的索引。 |
| 19 | int indexOf(String str, int fromIndex) | 返回從指定的索引開始,指定子串的第一次出現(xiàn)在給定字符串中的索引。 |
| 20 | String intern() | 返回字符串對象的規(guī)范表示。 |
| 21 | int lastIndexOf(int ch) | 返回指定字符在字符串中最后一次出現(xiàn)的索引。 |
| 22 | int lastIndexOf(int ch, int fromIndex) | 返回指定字符在給定字符串中的最后一次出現(xiàn)的索引,它從指定的索引開始向后搜索。 |
| 23 | int lastIndexOf(String str) | 返回指定子字符串在字符串內(nèi)的最右邊出現(xiàn)的索引。 |
| 24 | int lastIndexOf(String str, int fromIndex) | 返回指定子字符串在給定字符串中最后一次出現(xiàn)的索引,它從指定索引開始向后搜索。 |
| 25 | int length() | 返回此字符串的長度。 |
| 26 | boolean matches(String regex) | 測試這個字符串是否與給定的正則表達式匹配。 |
| 27 | boolean regionMatches(boolean ignoreCase, int toffset, String other, int offset, int len) | 測試兩個字符串區(qū)域是否相等。 |
| 28 | boolean regionMatches(int toffset, String other, int offset, int len) | 測試兩個字符串區(qū)域是否相等。 |
| 29 | String replace(char oldChar, char newChar) | 返回一個新的字符串,此字符串是使用newChar替換此字符串中所有出現(xiàn)的oldChar的結(jié)果。 |
| 30 | String replaceAll(String regex, String replacement | 使用replacement替換與給定正則表達式(regex)匹配的字符串中的每個子字符串。 |
| 31 | String replaceFirst(String regex, String replacement) | 用給定的replacement替換與給定正則表達式(regex)匹配的字符串中的第一個子字符串。 |
| 32 | String[] split(String regex) | 將此字符串拆分為給定正則表達式的匹配項。 |
| 33 | String[] split(String regex, int limit) | 將此字符串拆分為給定正則表達式的匹配項。 |
| 34 | boolean startsWith(String prefix) | 測試此字符串是否以指定的前綴開頭。 |
| 35 | boolean startsWith(String prefix, int toffset) | 測試此字符串是否以指定的前綴開頭,指定一個指定的索引。 |
| 36 | CharSequence subSequence(int beginIndex, int endIndex) | 返回一個新的字符序列,該序列是該序列的子序列。 |
| 37 | String substring(int beginIndex) | 返回一個新字符串,該字符串是此字符串的子字符串。 |
| 38 | String substring(int beginIndex, int endIndex) | 返回一個新字符串,該字符串是此字符串的子字符串。 |
| 39 | char[] toCharArray() | 將此字符串轉(zhuǎn)換為新的字符數(shù)組。 |
| 40 | String toLowerCase() | 使用默認語言環(huán)境的規(guī)則將此String中的所有字符轉(zhuǎn)換為小寫。 |
| 41 | String toLowerCase(Locale locale) | 使用給定的區(qū)域設(shè)置的規(guī)則將此String中的所有字符轉(zhuǎn)換為小寫。 |
| 42 | String toString() | 此對象(已經(jīng)是字符串)本身已被返回。 |
| 43 | String toUpperCase() | 使用默認語言環(huán)境的規(guī)則將此字符串中的所有字符轉(zhuǎn)換為大寫。 |
| 44 | String toUpperCase(Locale locale) | 使用給定的區(qū)域設(shè)置的規(guī)則將此String中的所有字符轉(zhuǎn)換為大寫。 |
| 45 | String trim() | 返回字符串的副本,省略前導(dǎo)和尾隨空格。 |
| 46 | static String valueOf(primitive data type x) | 返回傳遞數(shù)據(jù)類型參數(shù)的字符串表示形式。 |