use*_*927 12 string capitalization deprecated kotlin
Kotlincapitalize
在String
class上弃用了这个函数,并且他们建议的替换很长。这是一个例子,他们正确地呼吁弃用它,但错误地呼吁用户体验。
例如,这段代码:
val x = listOf("foo", "bar", "baz").map { it.capitalize() }
Run Code Online (Sandbox Code Playgroud)
被 IDE“清理”成:
val x = listOf("foo", "bar", "baz").map { it.replaceFirstChar {
if (it.isLowerCase()) it.titlecase(
Locale.getDefault()
) else it.toString()
} }
Run Code Online (Sandbox Code Playgroud)
这太丑了。我们对于它可以做些什么呢?
Jof*_*rey 12
建议的替换是丑陋的,因为它需要与之前的代码等效:
'?'
为'?'
)如果你不太关心 1 和 2,你可以使用一个更简单的表达式,使用不变的语言环境和无条件标题甚至已经大写的字母:
val x = listOf("foo", "bar", "baz").map { it.replaceFirstChar(Char::titlecase) }
Run Code Online (Sandbox Code Playgroud)
这意味着如果第一个字符已经是大写的'?'
,那么'?'
无论如何它都会被转换为 titlecase 变体,而原始代码不会触及它。这实际上可能是可取的。
此外,如果哑大写足以满足您的用例,您也可以改用它:
val x = listOf("foo", "bar", "baz").map { it.replaceFirstChar(Char::uppercase) }
Run Code Online (Sandbox Code Playgroud)
capitalize()
已被弃用的原因之一是该方法的行为尚不清楚。例如,行为 #2 非常奇怪,句子中不大写单词的行为可能是意料之外的(C# 会将每个空格分隔的单词命名为首字母大写)。
如果您想有意保留当前的确切行为,但使其更方便使用,您始终可以使用适合您的名称滚动您自己的扩展函数(“capitalize(d)”可能无法向不知情的读者提供足够的信息):
fun String.titlecaseFirstCharIfItIsLowercase() = replaceFirstChar {
if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString()
}
Run Code Online (Sandbox Code Playgroud)
或者对于具有不变语言环境的版本,标题为大写字符:
fun String.titlecaseFirstChar() = replaceFirstChar(Char::titlecase)
Run Code Online (Sandbox Code Playgroud)
一个巧妙的解决方案是在 String 上定义一个新的扩展函数,它用一个更简洁的名称隐藏了血腥的细节:
/**
* Replacement for Kotlin's deprecated `capitalize()` function.
*/
fun String.capitalized(): String {
return this.replaceFirstChar {
if (it.isLowerCase())
it.titlecase(Locale.getDefault())
else it.toString()
}
}
Run Code Online (Sandbox Code Playgroud)
现在你的旧代码看起来像这样:
val x = listOf("foo", "bar", "baz").map { it.capitalized() }
Run Code Online (Sandbox Code Playgroud)
您需要在某些可以轻松导入的包中的顶层定义扩展函数。例如,如果您有一个名为my.package.KotlinUtils
( KotlinUtils.kt
)的 kotlin 文件,并且您将定义放入其中,如下所示:
package my.package
fun String.capitalized(): String {...}
Run Code Online (Sandbox Code Playgroud)
然后你可以将它导入到你的其他包中:
import my.package.capitalized
Run Code Online (Sandbox Code Playgroud)
val fruits = listOf("baNana", "avocAdo", "apPle", "kiwifRuit")
fruits
.filter { it.startsWith("a") }
.sortedBy { it }
.map { it.lowercase().replaceFirstChar(Char::uppercase) }
.forEach { println(it) }
Run Code Online (Sandbox Code Playgroud)
输出:
Apple
Avocado
Run Code Online (Sandbox Code Playgroud)
小智 6
您可以对原始字符串调用replaceFirstChar函数并将转换函数作为输入传递。转换函数获取第一个字符并使用 uppercase() 函数将其转换为大写字符。
val list = listOf("foo", "bar", "baz") .map {
it.replaceFirstChar { firstChar ->
firstChar.uppercase()
}
}
println("List - > $list")
Run Code Online (Sandbox Code Playgroud)
输出
List - > [Foo, Bar, Baz]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1431 次 |
最近记录: |