Overview
本節(jié)主要介紹四種語言中的字符串的相關(guān)用法。由于字符串的 API 眾多,所以本節(jié)只挑幾個主要的來講。
Java 篇
聲明字面量
String s = "Hello World";
遍歷字符串
for (char c : s.toCharArray()) {
System.out.println(c);
}
多行文本
String text =
"\t1, 2, 3\n" +
"\tone, two, three\n" +
"\t\"x\", \"y\", \"z\"";
在 Java 中表示多行文本和特殊字符時(shí)需要使用對應(yīng)的轉(zhuǎn)義符刹前,看起來很不直觀,尤其是碰到表示 XML 或者 JSON 的字符串更是讓人頭痛雌桑。
字符串模板 Template
所謂的字符串模板或者說字符串插值就是使用變量或表達(dá)式的結(jié)果來代替字符串中的特殊占位符喇喉。
Java 語言本身并沒有字符串模板,要想實(shí)現(xiàn)模板功能只有自己解析字符串校坑,使用 replace()
等方法來進(jìn)行模擬轧飞。
例:
String name = "Peter";
String str = "name=$name, ${name.length()}";
System.out.println(
str.replace("$name", name)
.replace("${name.length()}", "" + name.length()))衅鹿;
或者也可以使用 format()
方法來實(shí)現(xiàn)
例
System.out.println(String.format("name=%s, %d", name, name.length()));
總的來說使用起來并不方便。
常用方法
// 獲取某一位置的字符
System.out.println(s.charAt(2)); // l
// 截取子串
System.out.println(s.substring(6, 9)); // Wor
StringBuilder
由于 Java 中字符串是不可變的过咬,所以直接連接字符串會創(chuàng)建大量對象大渤。因此 Java 提供了非同步版本的 StringBuilder
和同步的 StringBuffer
來用于創(chuàng)建字符串池。
例
StringBuilder content = new StringBuilder();
content.append("hello");
content.append(",");
content.append("\nworld");
content.append("!").append("!");
System.out.println(content);
需要注意不要使用 append("foo" + "bar")
這樣的形式而是使用 append("foo").append("bar")
掸绞,因?yàn)榍罢咄耆珕适Я?StringBuffer
的功能泵三。
Groovy 篇
聲明字面量
def s = "Hello World"
遍歷字符
for (c in s) {
println(c)
}
多行文本
def text =
""" 1, 2, 3
one, two, three
"x, "y", "z\""""
Groovy 中可以使用三個雙引號表示按原樣輸出,即在三個雙引號之間可以任意換行衔掸,使用特殊字符等烫幕,這種設(shè)計(jì)使 Groovy 中表示 XML 和 JSON 文本時(shí)更加簡單清晰。
需要注意如果要輸出的字符串結(jié)尾也是雙引號敞映,則必須像以上例子一樣在最后一個雙引號前加上轉(zhuǎn)義符 ""较曼,否則編譯器會將此雙引號和三個雙引號看做是兩組雙引號而報(bào)編譯錯誤钝荡。
字符串模板 Template
def name = "Peter"
def str = "name=${name}, ${if (name.length() > 10) 10 else name.length()}"
println(str) // name=Peter, 5
Groovy 中可以使用 ${}
來實(shí)現(xiàn)字符串模板必逆,大括號之間的字符會被解析為代碼并執(zhí)行,執(zhí)行的結(jié)果會被當(dāng)做字符串來輸出澜公,看起來就像是使用 Javascript 的 eval
函數(shù)一樣冕末,比起 Java 來說方便許多萍歉,再也不用使用一堆加號連接字符串和變量了。
GString
Groovy 和 Javascript 在字符串使用時(shí)有一個共同點(diǎn)档桃,就是可用使用單引號或雙引號來表示字符串枪孩,大部分情況下這兩者都是一樣的用法。但是使用模板時(shí)必須使用雙引號藻肄,因?yàn)榘梅?${}
的以雙引號包裹的字符串會被解析為 Groovy 內(nèi)置的字符串類 GString蔑舞。該類是 String 類的補(bǔ)充,擁有很多 Groovy 語言的方法嘹屯。而單引號字符串或不包含引用符號的字符串都會被解析為普通的 Java String 類攻询,也就沒有模板等功能了。
常用方法
// 獲取某一位置的字符
println(s[2]) // l
// 截取字符串抚垄,"<" 表示不包含
println(s[6..9]) // Worl
println(s[6..<9]) // Wor
// 返回從字符串中減去某一部分的新字符串
println(s - "l" - "World") // Helo
StringBuilder
Groovy 可以直接使用更簡便的符號 <<
追加子串。
def content = new StringBuilder()
content.append "hello"
content << ","
content << "\nworld"
content << "!" << "!"
Scala 篇
聲明字面量
val s = "Hello World"
遍歷字符
for (c <- s) {
println(c)
}
多行文本
Scala 的多行文本使用方式與 Groovy 基本一致
val text =
""" 1, 2, 3
one, two, three
"x, "y", "z""""
字符串模板 Template
Scala 的字符串模板主要依賴于兩種插值器(Interpolator):s 插值器和 f 插值器
s 插值器
s 插值器主要用于進(jìn)行簡單的字符串替換谋逻,聲明時(shí)直接使用字符 "s" 連接字符串且當(dāng)中不要有空格呆馁。
例
val name = "Peter"
val str = s"name=$name, ${if (name.length() > 10) 10 else name.length}"
println(str) // name=Peter, 5
f 插值器
f 插值器主要用于進(jìn)行格式化輸出,類似 String.format()
的功能毁兆。
例
val salary = 100.1
println(f"$name%s has $salary%.5f") // Peter has 100.10000
常用方法
// 獲取某一位置的字符
println(s.charAt(2)) // l
// 截取字符串
println(s.substring(6,9)) // Wor
StringBuilder
Scala 中除了 append()
方法也可以用重載的操作符進(jìn)行修改浙滤。
val content = new StringBuilder
content append "hello"
content += ','
content ++= "\nworld"
content ++= "!" ++= "!"
+=
用于添加字符,由于 Scala 中將字符串視為字符的集合所以可以用 ++=
添加字符串气堕。
Kotlin 篇
聲明字面量
val s = "Hello World"
遍歷字符
for (c in s) {
println(c)
}
多行文本
同樣使用三個引號
val text =
""" 1, 2, 3
one, two, three
"x, "y", "z""""
在使用多行文本時(shí)可以在字符串中添加邊距符號纺腊,默認(rèn)邊距符號為 |
val textWithMargin =
"""
|Tell me and I forget.
|Teach me and I remember.
|Involve me and I learn.
|(Benjamin Franklin)
""".trimMargin()
然后可以使用 trimMargin()
方法去除邊距符號和其之前的所有空白字符畔咧,通過該種方式可用實(shí)現(xiàn)更細(xì)致的排版
字符串模板 Template
同樣使用 ${}
符號
val name = "Peter"
val str = "name=${name}, ${if (name.length > 10) 10 else name.length}"
println(str) // name=Peter, 5
如果希望在字符串模板中使用 $
符號需要使用 ${'$'}
這樣的形式才可以正常顯示
"name=${'$'}{name}"
StringBuilder
Kotlin 中可以直接使用內(nèi)置的 DSL 語句創(chuàng)建可變字符串
val content = buildString {
append("hello")
appendln(',') // 添加換行
append("world")
append("!", "!") // 添加多參數(shù)
}
常用方法
// 獲取某一位置的字符
println(s[2])
// 截取字符串
println(s.substring(5, 8))
Summary
- 除了 Java 之外,其它三種語言都可用使用三個引號實(shí)現(xiàn)多行文本
- 除了 Java 之外揖膜,其它三種語言都支持字符串模板誓沸,其中 Scala 的語法略微不一樣
- Groovy 支持 String 和對其進(jìn)行擴(kuò)展的 GString 兩種字符串
文章源碼見 https://github.com/SidneyXu/JGSK 倉庫的 _07_string
小節(jié)