如何直接从 Kotlin 源使用 Java String 方法(拆分)?

Ren*_*ato 3 kotlin

做一些分析,我的瓶颈似乎是 Kotlinkotlin.CharSequence.split()扩展功能。

我的代码只是做这样的事情:

val delimiter = '\t'
val line = "example\tline"
val parts = line.split(delimiter)
Run Code Online (Sandbox Code Playgroud)

您可能会注意到,parts是一个List<String>.

我想split直接使用 Java 进行基准测试,它返回 aString[]并且可能更有效。

如何String::split(String)直接从 Kotlin 源代码调用 Java ?

hol*_*ava 5

您可以将 a 转换kotlin.String为 ajava.lang.String然后使用java.lang.String#split因为kotlin.String将被映射java.lang.String,但您会收到警告。例如:

//                               v--- PLATFORM_CLASS_MAPPED_TO_KOTLIN warnings
val parts: Array<String> = (line as java.lang.String).split("\t")
Run Code Online (Sandbox Code Playgroud)

您也可以使用java.util.regex.Pattern#split代替,因为@Renato 提到它会比java.lang.String#split在某些情况下更慢。例如:

val parts: Array<String> = Pattern.compile("\t").split(line, 0)
Run Code Online (Sandbox Code Playgroud)

但要小心,kotlin.String#split的行为与 不同java.lang.String#split,例如:

val line: String = "example\tline\t"

//   v--- ["example", "line"]
val parts1: Array<String> = Pattern.compile("\t").split(line, 0)

//   v--- ["example", "line", ""]
val parts2 = line.split("\t".toRegex())
Run Code Online (Sandbox Code Playgroud)

  • 如果有人使用它,您可以使用`@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")`抑制警告 (2认同)