Kotlin(五)—— 字符串的定义和操作

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 定义原生字符串

JavaJEP 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值