为什么 Kotlin 的 split("") 函数会导致前导和尾随空字符串?

mar*_*211 6 java kotlin

我是一名 Java 开发人员,尝试过 Kotlin,并发现这两种语言之间存在违反直觉的情况。

考虑 Kotlin 中的给定代码:

"???".split("")  # gives ["", "?", "?", "?", ""]
Run Code Online (Sandbox Code Playgroud)

Java 中也是如此:

"???".split("")  # gives ["?", "?", "?"]
Run Code Online (Sandbox Code Playgroud)

为什么 Kotlin 在结果数组中产生前导和尾随空格字符串?或者Java总是删除这些空字符串,而我只是没有意识到这一点?

我知道toCharArray()每个 Kotlin 上都有这个方法String,但它仍然不是很直观(也许 Java 开发人员应该放弃 Java 的旧习惯,他们希望在新语言中重用这些习惯?)。

shr*_*ilc 8

这是因为 Javasplit(String regex)方法显式删除了它们:

此方法的工作方式类似于使用给定表达式和零限制参数调用双参数 split 方法。因此,尾随空字符串不包含在结果数组中。

split(String regex, int limit)提到:

当该字符串的开头存在正宽度匹配时,则在结果数组的开头包含一个空的前导子字符串。然而,开头的零宽度匹配永远不会产生这样的空前导子字符串。

""是零宽度匹配。不知道为什么你认为toCharArray()这里不直观,用空字符串分割来迭代所有字符是一种迂回的做事方式。split()旨在进行模式匹配并获取字符串组。

PS:我检查了 JDK 8、11 和 17,现在行为似乎已经一致了一段时间。