1. 简介

Kotlin 相较于 Java 的一大亮点就是扩展函数(extension functions)机制。它允许我们在不继承类、也不修改原类的前提下,为已有类“添加”新的方法。这里的“添加”并非真正改变源码,而是让调用者可以像调用类自身方法一样使用这些新增功能。

本文聚焦于 Kotlin 为 String 类内置的一系列常用扩展函数。这些函数在日常开发中极为高频,掌握它们能显著提升编码效率,避免重复造轮子。

2. 何时使用扩展函数

理解扩展函数的适用场景比知道语法更重要。✅

最典型的使用时机是:你想给一个无法修改的类增加新行为。比如 JDK 内置类、第三方库类,或者你没有权限改动的代码。

举个例子:你需要频繁计算整数的立方,但 Int 类本身没有提供 .cube() 方法。由于不能直接修改 Int 的源码,这时就可以定义一个扩展函数:

fun Int.cube() = this * this * this

// 使用
val result = 3.cube() // 27

这个例子虽然简单,但体现了扩展函数的核心价值——增强封闭类的能力。更多关于扩展函数的深入内容可参考 Baeldung 的扩展函数教程

⚠️ 踩坑提醒:扩展函数其实是静态解析的,不会参与多态。这意味着它基于变量声明类型而非运行时类型生效。

3. Kotlin 中 String 类的常见扩展函数

Kotlin 标准库为 String 提供了大量开箱即用的扩展函数。以下列出最常用的部分,并附带示例说明。

3.1. replace()

replace() 用于替换字符串中的字符或子串,有两种重载形式。

第一种接收单个字符:

fun String.replace(
    oldChar: Char,
    newChar: Char,
    ignoreCase: Boolean = false
): String
  • ignoreCase = true 时忽略大小写
  • 返回新字符串,原字符串不变
val inputString0 = "Jelly" 
assertEquals("Jezzy", inputString0.replace('l', 'z'))
assertEquals("Pelly", inputString0.replace('j', 'P', true))  // 忽略大小写
assertEquals("Jelly", inputString0.replace('j', 'P'))        // 区分大小写,不匹配

第二种接收字符串参数:

fun String.replace(
    oldValue: String,
    newValue: String,
    ignoreCase: Boolean = false
): String
val inputString1 = "Kotlin Replace Program"
assertEquals("Kotlin Replace Examples", inputString1.replace("PROGRAM", "Examples", true))

✅ 建议优先使用 ignoreCase 参数处理大小写敏感问题,而不是手动转大小写再比较。


3.2. uppercase()

将字符串全部转为大写:

fun String.uppercase(): String
var str = "Extension Functions"
var result = str.uppercase()
assertEquals("EXTENSION FUNCTIONS", result)

⚠️ 注意:这是 Kotlin 1.5+ 的写法,旧版本使用 toUpperCase()


3.3. lowercase()

uppercase() 相反,转为小写:

fun String.lowercase(): String
var str = "Extension Functions"
var result = str.lowercase()
assertEquals("extension functions", result)

同样,推荐使用新命名 lowercase() 而非 toLowerCase()


3.4. toCharArray()

将字符串转换为字符数组:

fun String.toCharArray(): CharArray
val str = "functions"
val chars = str.toCharArray()
val convertedString = String(chars)
assertEquals("functions", convertedString)

这个方法在需要逐字符处理时非常有用,比如实现自定义解析逻辑。


3.5. substring()

提取子字符串,有两个版本:

fun String.substring(startIndex: Int): String

从指定索引到末尾:

val str1 = "Hello World"
val substring1 = str1.substring(6)  // 注意:方法名是 substring,原文拼写错误
assertEquals("World", substring1)
fun String.substring(startIndex: Int, endIndex: Int): String

提取 [startIndex, endIndex) 区间内的子串(左闭右开):

val str1 = "Hello World"
val substring2 = str1.substring(0, 5)
assertEquals("Hello", substring2)

⚠️ 注意:endIndex 不包含在结果中,且索引越界会抛出异常。


3.6. startsWith()

判断字符串是否以指定前缀开头,支持起始位置和忽略大小写。

基础版本:

fun String.startsWith(
    prefix: String,
    ignoreCase: Boolean = false
): Boolean
val str = "extensionfunctions" 
assertTrue(str.startsWith("ext"))

指定起始位置的版本:

fun String.startsWith(
    prefix: String,
    startIndex: Int,
    ignoreCase: Boolean = false
): Boolean
val str = "extensionfunctions" 
assertTrue(str.startsWith("fun", 9))

这个特性在解析协议头、文件格式等场景特别实用。


3.7. endsWith()

判断字符串是否以指定后缀结尾:

fun String.endsWith(
    suffix: String,
    ignoreCase: Boolean = false
): Boolean
val str = "Kotlin" 
assertTrue(str.endsWith("lin"))

常用于判断文件扩展名、URL 路径结尾等。


3.8. compareTo()

用于比较两个字符串的字典序:

fun compareTo(other: String): Int

返回值含义:

  • 0:两字符串相等
  • ✅ 正数:调用者 > 参数字符串(按 ASCII)
  • ✅ 负数:调用者 < 参数字符串
var str1 = "Hello"
var str2 = "Hello"
assertTrue(str1.compareTo(str2) == 0)

str2 = "Hallo"
assertTrue(str1.compareTo(str2) > 0)  // 'e' > 'a'

assertTrue(str2.compareTo(str1) < 0)  // 反向比较

⚠️ 原文此处有误:str2.compareTo(str2, str1) 是无效写法,已修正为 str2.compareTo(str1)


3.9. toByteArray()

将字符串编码为字节数组,默认使用 UTF-8:

fun String.toByteArray(
    charset: Charset = Charsets.UTF_8
): ByteArray
val str = "Hello" 
val byteArray = str.toByteArray()
assertEquals("[72, 101, 108, 108, 111]", byteArray.contentToString())

contentToString()ByteArray 的扩展函数,用于美观输出数组内容。


3.10. capitalize()

将字符串首字母大写,其余保持不变:

fun String.capitalize(): String
var str = "kotlin functions"
assertEquals("Kotlin functions", str.capitalize())

如果首字母已是大写或字符串为空,则返回原串。

❌ 注意:不要与 uppercase() 混淆,capitalize() 只影响第一个字符。


4. 总结

扩展函数是 Kotlin 的核心特性之一,它让代码更具表达力和复用性。对于 String 类,Kotlin 提供了丰富且实用的扩展函数,覆盖了日常开发中绝大多数文本处理需求。

合理利用这些函数,不仅能减少样板代码,还能提升代码可读性和健壮性。建议结合实际项目多加练习,逐步内化为自己的编码习惯。

文中所有示例代码及相关测试用例均已上传至 GitHub:Baeldung Kotlin 教程仓库


原始标题:Common String Extension Functions in Kotlin