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 教程仓库。