【发布时间】:2020-07-08 05:54:24
【问题描述】:
在 kotlin 中修剪删除空间 int 前导和尾随,但是当 android studio 将 java 代码转换为 kotlin ,将 java 中的 trim() 转换为 kotlin 中的 trim{it
【问题讨论】:
在 kotlin 中修剪删除空间 int 前导和尾随,但是当 android studio 将 java 代码转换为 kotlin ,将 java 中的 trim() 转换为 kotlin 中的 trim{it
【问题讨论】:
根据文档:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/trim.html
fun String.trim(): 字符串 返回删除了前导和尾随空格的字符串。
it <= ' ' 将删除所有“不可打印”字符,其中ascii code 小于或等于空格(ascii 十进制 = 32)作为回车、换行...
我刚刚测试了很多这样的字符:
val kotlin = "\t?\t"
println(kotlin)
val kotlin2 = "\t?\t".trim()
println(kotlin2)
val kotlin3 = "\t?\t".trim{it <= ' '}
println(kotlin3)
这个输出:
?
?
?
他们都清理了这个字符。正如@AlexeyRomanov 所说,kotlin 将使用isWhitespace 方法返回true 的字符理解为空白字符。所以 it <= ' ' 是让它只修剪与 java 相同的字符,而不是根据 Unicode 标准修剪其他空白字符。
如果我们测试例如\u00A0 字符:
val kotlin4 = "\u00A0?\u00A0".trim()
println(kotlin4)
val kotlin5 = "\u00A0?\u00A0".trim{it <= ' '}
println(kotlin5)
我们可以看到输出的不同:
?
?
您可以在kotlin playground中进行测试。
【讨论】:
\t,它的代码是9 \u0001)
Java 的 trim documentation 说
否则,如果字符串中没有代码大于'\u0020'的字符,则返回一个表示空字符串的String对象。
否则,设k为字符串中编码大于'\u0020'的第一个字符的索引,设m为字符串中编码大于'\u0020'的最后一个字符的索引。返回一个String对象,表示这个字符串的子字符串,以索引k处的字符开始,以索引m处的字符结束——即this.substring(k, m + 1)的结果。
所以条件正好是{ it <= ' ' }(其中it 是字符串中的一个字符)。
Kotlin 改为 uses
public fun CharSequence.trim(): CharSequence = trim(Char::isWhitespace)
这是真的,例如对于不间断空格\u00A0、Ogham 空格标记\u1680 等,对于' ' 以下的某些字符(例如\u0001)为false。
【讨论】: