Bootstrap

Kotlin学习 - 字符串操作

字符串模板

1、和许多脚本语言一样,Kotlin让我们可以在字符串字面值中引用局部变量,只需要前面加个$

fun printName(name:String) {
    println("My name is $name")
}

调用代码:

fun main() {
    printName("Lily")
}

//运行结果
My name is Lily

2、还可以引用更复杂的表达式,只需要把表达式用括号括起来:${表达式}

fun printName(name: String) {
   println("Hello , ${if (name.isNotEmpty()) name else "someone"}")
}

调用代码:

fun main() {
    printName("Lily")
}

//运行结果
Hello , Lily

字符串操作符substring

使用字符串截取操作符substring来截取一段名字。截取的字符串包含开始索引的字符,不包含结束索引的字符。

const val NAME = "Lucky's friends"

fun main() {
	val nameEndIndex = NAME.indexOf("\'")
	val name = NAME.substring(0, nameIndex)
	println("nameEndIndex: $nameEndIndex | name: $name")
}

//运行结果:nameEndIndex: 5 | name: Lucky

还可以使用until关键字实现,结果和上面相同。

const val NAME = "Lucky's friends"

fun main() {
	val nameEndIndex = NAME.indexOf("\'")
	val name = NAME.substring(0 until nameEndIndex)
	println("nameEndIndex: $nameEndIndex | name: $name")
}

字符串操作符split

const val NAMES = "Jack,Lucky,Tom"

fun main() {
	val names = NAMES.split(",")
    println(names[2])
}
//运行结果:Tom

split返回一个List集合,List集合支持解构语法特性,它允许在一个表达式中给多个变量赋值,解构常用来简化变量的赋值。来看下例子:

const val NAMES = "Jack,Lucky,Tom"

fun main() {
	//解构语法特性
    val (s1, s2, s3) = NAMES.split(",")
    println("$s1,$s2,$s3")
}

//运行结果:Jack,Lucky,Tom

当然还有个小技巧,如果不想要其中的某个元素,直接用下划线代替变量就行,例如我们不要第二个名字,修改代码如下:

const val NAMES = "Jack,Lucky,Tom"

fun main() {
    val (a, _, b) = NAMES.split(",")
    println("$a,$b")
}

//运行结果:Jack,Tom

字符串操作符replace

替换操作符,下面是一个简单的使用,可以看到替换以后产生一个新的字符串,原字符串没有改变。

fun main() {
	val originStr = "reining day"
	val newStr1 = originStr.replace("e", "a")
	println(newStr1)
	println(originStr)
}

//运行结果:
//raining day
//reining day

再来看个复杂点的例子,可以传入正则表达式进行替换,看下例子:

fun main() {
	//加密下面的字符串
	val fruits = "apple,banana,pear"
	//第一个是正则表达式,决定替换哪些字符
    //第二个是匿名函数,决定改如何替换正则表达式中的字符
    val encryptionFruits = fruits.replace(Regex("[a,b,p]")) {
    	when (it.value) {
            "a" -> "6"
            "b" -> "7"
            "p" -> "8"
            else -> it.value
        }
    }
    println(encryptionFruits)
}
//运行结果:688le,76n6n6,8e6r

字符串操作符forEach

const val NAME = "Lucky's friends"

fun main() {
	//遍历forEach
    NAME.forEach {
        print("$it ** ")
    }
}

//运行结果:L ** u ** c ** k ** y ** ' ** s **   ** f ** r ** i ** e ** n ** d ** s ** 

字符串运算符== 和 ===

在Kotlin中==相当于Java中的equals,是对字符串的内容进行比较,相同返回true,不同返回false

在Kotlin中===相当于Java中的==,是对字符串的地址进行比较,相同返回true,不同返回false

下面例子中声明了两个字符串常量,声明的第一个字符串会存放在字符串常量池中,声明name2的时候会先去常量池看看有没有,如果之前定义过直接指向该对象,所以name1name2都是指向常量池中的同一个字符串。无论是地址还是内容都是相同的。

fun main() {
    val name1 = "Lucky"
    val name2 = "Lucky"
    println(name1 == name2)
    println(name1 === name2)
}

//运行结果:true和true

再来看下另一个例子:

fun main() {
   val name1 = "Lucky"
   val name3 = "lucky".capitalize()
   println(name1 == name3)
   println(name1 === name3)
}
//运行结果:true和false

name3虽然和name1内容相同,但是再调用capitalize()的时候会生成一个新的对象,所以内容相同地址不同。

;