Kotlin
中的字符串并与Java
中一样,通过双引号来定义一个字符串,它是不可变的对象:
val str = "hello world!"
然后,可以对其进行各种熟悉的操作:
str.length // 12
str.substring(0,5) // hello
str + " hello Kotlin!" // hello world! hello Kotlin!
str.replace("world", "Kotlin") // hello Kotlin!
由于String
是一个字符序列,所以我们可以对其进行遍历:
for (i in str.toUpperCase()) {
print(i)
}
还可以访问这个字符序列的成员:
str[0] // h
str.first() // h
str.last() // !
str[str.length - 1] // !
此外,Kotlin
的字符串还有各种丰富的API
,如:
// 判断是否为空字符串
"".isEmpty() // true
" ".isEmpty() // false
" ".isBlank() // true
"abcdefg".filter { c -> c in 'a'..'d' } // abcd
1 定义原生字符串
Java
在JEP 326
改进计划中提议,增加原生字符串的语法支持,因为目前它只能通过转义字符的迂回办法来支持,非常麻烦。而在Kotlin
中,已经支持了这种语法,下面来定义一个多行的原生字符串体验一下:
fun main() {
val rawString = """
\n Kotlin is awesome.
\n Kotlin is a better Java."""
println(rawString)
}
// 打印结果
//
// \n Kotlin is awesome.
// \n Kotlin is a better Java.
用3
个引号定义的字符串,最终的打印格式与在代码中所呈现的格式一致,而不会解释转化转义字符(如上述例子中的\n
),以及Unicode
的转义字符(如\uXXXX
)。
比如,我们用字符串来描述一段HTML
代码,用普通字符串定义时必须是这样子:
val html = "<html>\n" +
" <body>\n" +
" <p>Hello World.</p>\n" +
" </body>\n" +
"</html>\n"
采用原生字符串的格式,会非常方便。如下:
val html = """<html>
<body>
<p>Hello World.</p>
</body>
</html>
"""
2 字符串模板
举一个很常见的字符串字面量与变量拼接的例子:
fun main() {
message("Shaw", "Kotlin")
}
fun message(name: String, lang: String) = "Hi " + name + ", welcome to " + lang + "!"
上述代码描述了一个消息模板函数,通过传入消息字段变量,最终返回消息字符串。 然而,简简单单的一句话,竟然使用了4
个加号,可见相当地不简洁。在Java
中,经常会遇到类似的操作。
**Kotlin
引入了字符串模板来改善这一情况,它支持将变量植入字符串。**通过它来修改上面的message
函数:
fun message(name: String, lang: String) = "Hi $name, welcome to $lang!"
这与声明一个普通的字符串在形式上没什么区别,唯一要做的就是把变量如姓名,通过${name}的格式传入字符串。通过对比可以明显看出,字符串模板大大提升了代码的紧凑性和可读性。
此外,**除了变量我们也可以把表达式通过同样的方式插入字符串中,**并且在 ${expression}中使用双引号。如:
"Kotlin has ${if ("Kotlin".length > 0) "Kotlin".length else "no"} letters"
3 字符串判等
Kotlin
中的判等性主要有两种类型:
- 结构相等。通过操作符
==
来判断两个对象的内容是否相等; - 引用相等。通过操作符
===
来判断两个对象的引用是否一样,与之相反的判断操作符是!==
。如果比较的是在运行时的原始类型,比如Int
,那么===
判断的效果也等价于==
;
下面通过具体的例子来检测下字符串两种类型的相等性:
val a = "Java"
val b = "Java"
val c = "Kotlin"
val d = "Kot"
val e = "lin"
var f = d + e
println(a == b) // true
println(a === b) // true
println(c == f) // true
println(c === f) // false