本章將介紹Scala中的字串。 在Scala中的字串和Java中的一樣,字串是一個不可變的對象,也就是一個不能修改的對象。可以修改的對象,如數組,稱為可變對象。字串是非常有用的對象,在本節的最後部分,我們將介紹java.lang.String
類的一些重要方法。
1.創建一個字串
以下是創建一個字串的代碼 -
var greeting = "Hello world!";
// 或者
var greeting:String = "Hello world!";
每當編譯器在代碼中遇到一個字串文字時,它會創建一個帶有它的值的String對象,在這種情況下是“Hello world!”
。String
關鍵字也可以在如上所示的第二個聲明中給出。
請嘗試以下示例程式。
object Demo {
val greeting: String = "Hello, world!"
def main(args: Array[String]) {
println( greeting )
}
}
將上述程式保存在原始檔案:Demo.scala中,使用以下命令編譯和執行此程式。
D:\> scalac Demo.scala
D:\> scala Demo
Hello, world!
如前所述,String
類是不可變的。創建後的String
對象是無法更改的。如果有必要對字串進行大量修改,那麼可考慮使用Scala中提供的StringBuilder
類。
2. 字串長度
用於獲取有關對象的資訊的方法稱為訪問器方法。一個可以與字串一起使用的訪問器方法是length()
方法,它返回字串對象中包含的字元數。
使用以下代碼段來查找字串的長度 -
例子
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中,使用以下命令編譯和執行此程式。
$ scalac Demo.scala
$ scala Demo
String Length is : 17
3. 連接字串
String類包括一個連接兩個字串的方法 -
string1.concat(string2);
這將返回一個新的字串,字串string1
的尾部添加字串string2
。您也可以使用concat()
方法在字串文字上操作,如下 -
"My name is ".concat("Zara");
字串通常還使用+
運算符連接,如 -
"Hello," + " world" + "!"
這將產生以下結果 -
"Hello, world!"
以下代碼行將兩個字串相連接 -
object Demo {
def main(args: Array[String]) {
var str1 = "Dot saw I was ";
var str2 = "Tod";
println("Dot " + str1 + str2);
}
}
將上述程式保存在原始檔案:Demo.scala中,使用以下命令編譯和執行此程式。
D:\>scalac Demo.scala
D:\>scala Demo
Dot Dot saw I was Tod
4. 創建格式化字串
您可以使用printf()
和format()
方法列印具有格式化數字或字串的輸出。 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中,以下命令用於編譯和執行此程式。
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!()
5. 字串插值
字串插值是使用Scala編程語言創建字串的新方法。此功能支持只在Scala-2.10及更高版本。字串插值:直接在過程字串文字中嵌入變數引用的機制。
字串插值中有三種類型(插值器)實現。
5.1. ‘s’字串插值器
文字's'
允許在處理字串時直接使用變數。任何在範圍中的String變數可以在字串中使用。以下是's'
字串插值器的不同用法。
在println
語句中將String
變數($name
)附加到普通字串(Hello
)中,以下示例代碼片段用於實現'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
嘗試實現's'
插值器的示例程式如下 -
object Demo {
def main(args: Array[String]) {
val name = "James"
println(s"Hello, $name")
println(s"1 + 1 = ${1 + 1}")
}
}
將上述程式保存在原始檔案:Demo.scala中,使用以下命令編譯和執行此程式。
D:\>scalac Demo.scala
D:\>scala Demo
Hello, James
1 + 1 = 2
5.2 ‘f’插值器
文字'f'
插值器允許創建一個格式化的字串,類似於C語言中的printf
。 在使用'f'
插值器時,所有變數引用都應該是printf
樣式格式說明符,如%d
,%i
,%f
等。
我們以一般的字串為例附加浮點值(height = 1.9d
)和字串變數(name =“James”
)。下麵的代碼片段實現'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
的字串。
5.3 “原始”插值器
'raw'
內插器類似於's'
插值器,除了它不執行字串內的文字轉義。下表中的代碼段將區別's'
和'raw'
插值器的用法。 在使用s
和\n
效果的輸出中,新行作為原始值輸出,也就是\n
將不起作用。它將使用轉義字母列印完整的字串。
's'
的插值器使用,程式代碼如下 -object Demo { def main(args: Array[String]) { println(s"Result = \n a \n b") } }
輸出結果 -
Result = a b
'raw'
的插值器使用,程式代碼如下 -object Demo { def main(args: Array[String]) { println(raw"Result = \n a \n b") } }
輸出結果 -
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) | 返回一個字串,表示指定的數組中的字元序列。 |
8 | static String copyValueOf(char[] data, int offset, int count) | 返回一個字串,表示指定的數組中的字元序列。 |
9 | boolean endsWith(String suffix) | 測試此字串是否以指定的字串為尾碼/結尾。 |
10 | boolean equals(Object anObject) | 將此字串與指定對象進行比較。 |
11 | boolean equalsIgnoreCase(String anotherString) | 將此String與另一個String進行比較,並忽略大小寫。 |
12 | byte getBytes() | 使用平臺的默認字元集將此String編碼為一系列位元組,將結果存儲到新的位元組數組中。 |
13 | byte[] getBytes(String charsetName) | 使用命名的字元集將此String編碼為一系列位元組,將結果存儲到新的位元組數組中。 |
14 | void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) | 將此字串從srcBegin 到srcEnd 索引處的字元複製到目標字元數組(dst )中。 |
15 | int hashCode() | 返回此字串的哈希碼。 |
16 | int indexOf(int ch) | 返回指定字元第一次在字串中出現的索引。 |
17 | int indexOf(int ch, int fromIndex) | 返回指定字元以指定的索引開始搜索第一次在字串內出現的索引。 |
18 | int indexOf(String str) | 返回指定子字串在字串內第一次出現的索引。 |
19 | int indexOf(String str, int fromIndex) | 返回從指定的索引開始,指定子串的第一次出現在給定字串中的索引。 |
20 | String intern() | 返回字串對象的規範表示。 |
21 | int lastIndexOf(int ch) | 返回指定字元在字串中最後一次出現的索引。 |
22 | int lastIndexOf(int ch, int fromIndex) | 返回指定字元在給定字串中的最後一次出現的索引,它從指定的索引開始向後搜索。 |
23 | int lastIndexOf(String str) | 返回指定子字串在字串內的最右邊出現的索引。 |
24 | int lastIndexOf(String str, int fromIndex) | 返回指定子字串在給定字串中最後一次出現的索引,它從指定索引開始向後搜索。 |
25 | int length() | 返回此字串的長度。 |
26 | boolean matches(String regex) | 測試這個字串是否與給定的正則運算式匹配。 |
27 | boolean regionMatches(boolean ignoreCase, int toffset, String other, int offset, int len) | 測試兩個字串區域是否相等。 |
28 | boolean regionMatches(int toffset, String other, int offset, int len) | 測試兩個字串區域是否相等。 |
29 | String replace(char oldChar, char newChar) | 返回一個新的字串,此字串是使用newChar 替換此字串中所有出現的oldChar 的結果。 |
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() | 將此字串轉換為新的字元數組。 |
40 | String toLowerCase() | 使用默認語言環境的規則將此String中的所有字元轉換為小寫。 |
41 | String toLowerCase(Locale locale) | 使用給定的區域設置的規則將此String中的所有字元轉換為小寫。 |
42 | String toString() | 此對象(已經是字串)本身已被返回。 |
43 | String toUpperCase() | 使用默認語言環境的規則將此字串中的所有字元轉換為大寫。 |
44 | String toUpperCase(Locale locale) | 使用給定的區域設置的規則將此String中的所有字元轉換為大寫。 |
45 | String trim() | 返回字串的副本,省略前導和尾隨空格。 |
46 | static String valueOf(primitive data type x) | 返回傳遞數據類型參數的字串表示形式。 |