这里的trim字符串函数中的"it <= ' '"是什么意思?

33

我有这个 Java 代码来修剪字符串

String title = titleEt.getText().toString().trim();

当我转换为Kotlin时,我希望以下代码可以用于去除字符串开头和结尾的空格。

val title = titleEt.text.toString().trim()

然而,IDE 会生成这段代码

val title = titleEt.text.toString().trim { it <= ' ' }
这里的 { it <= ' ' } 是什么?它表示任何小于或等于空格的字符吗?
4个回答

50
Java的String#trim()将字符串开始和结束处所有介于'\u0000'(NUL)和'\u0020'(SPACE)之间的码位都删除。
Kotlin的CharSequence.trim()默认只删除前导和尾随空格(与Char.isWhitespace匹配的字符,即Character#isWhitespace(char))。为了达到与Java相同的行为,IDE生成了一个谓词,匹配Java会删除的相同字符。
这些字符包括ASCII空格,但也包括控制字符。
'\u0000' ␀ ('\0')
'\u0001' ␁
'\u0002' ␂
'\u0003' ␃
'\u0004' ␄
'\u0005' ␅
'\u0006' ␆
'\u0007' ␇ ('\a')
'\u0008' ␈ ('\b')
'\u0009' ␉ ('\t')
'\u000A' ␊ ('\n')
'\u000B' ␋ ('\v')
'\u000C' ␌ ('\f')
'\u000D' ␍ ('\r')
'\u000E' ␎
'\u000F' ␏
'\u0010' ␐
'\u0011' ␑
'\u0012' ␒
'\u0013' ␓
'\u0014' ␔
'\u0015' ␕
'\u0016' ␖
'\u0017' ␗
'\u0018' ␘
'\u0019' ␙
'\u001A' ␚
'\u001B' ␛
'\u001C' ␜
'\u001D' ␝
'\u001E' ␞
'\u001F' ␟
'\u0020' ␠ (' ')

4

Kotlin中的trim函数允许使用谓词,因此在Java代码中使用trim(删除空格)与.trim { it <= ' ' }相同。 你也可以在Kotlin中使用.trim()


你介意用其他词语解释一下吗?我还是无法理解。 - João Carlos
3
当你从Java转换到Kotlin时,插件会将Java的trim()方法转换为.trim{ it <=' '},因为Kotlin的trim()方法允许使用谓词。在这种情况下,谓词是一个空格。 - Fredy Mederos

3
它在比较每个字符的ASCII值时与空格(' ')进行比较。如果字符的ASCII值小于或等于空格(' ')的ASCII值,则将其删除。
如果查看ASCII表,空格(ASCII 32)以下的符号是不可打印的控制字符。因此,除空格以外的所有可打印字符的ASCII值都高于空格(即32)。因此,如果被删除的字符的ASCII值小于或等于' '(空格),我们将得到没有前导和尾随空格的剩余字符串。
这就是Java中`trim()`函数的工作原理。但是,在Kotlin中也可以直接使用`trim()`函数:
titleEt.text.toString().trim()

2
请参考String.trim中带有predicate的重载方法。据说它会删除与谓词匹配的字符串开头和结尾的字符。在您的情况下,它将修剪小于或等于' '(空格)的字符。
这正是java.lang.String#trim的工作原理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接