本章將介紹Scala中的字串。 在Scala中的字串和Java中的一樣,字串是一個不可變的物件,也就是一個不能修改的物件。可以修改的物件,如陣列,稱為可變物件。字串是非常有用的物件,在本節的最後部分,我們將介紹java.lang.String
類的一些重要方法。
以下是建立一個字串的程式碼 -
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
類。
用於獲取有關物件的資訊的方法稱為存取器方法。一個可以與字串一起使用的存取器方法是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
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
您可以使用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!()
字串插值是使用Scala程式設計語言建立字串的新方法。此功能支援只在Scala-2.10及更高版本。字串插值:直接在過程字串文字中嵌入變數參照的機制。
字串插值中有三種型別(插值器)實現。
文字'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
文字'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
的字串。
'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) | 返回傳遞資料型別引數的字串表示形式。 |