如何在Kotlin函数式方法(如indexOfFirst)中使用多个谓词?
解决Kotlin中indexOfFirst多条件谓词的问题
你的问题出在对indexOfFirst的lambda参数理解错误:lambda里的it是当前遍历到的字符,而非字符的索引。直接对it做+1操作是修改字符的ASCII值,完全无法达到访问下一个位置字符的目的。
正确写法
要同时获取字符和对应的索引,你可以用withIndex()把字符串转换成包含索引与字符的序列,再调用indexOfFirst:
val punctuationChars = setOf('!', '?', '.') text.withIndex().indexOfFirst { (index, char) -> // 先做边界检查,避免索引越界 index + 2 < text.length && char in punctuationChars && text[index + 1].isWhitespace() && text[index + 2].isUpperCase() }
关键说明
- 边界检查:必须先判断
index + 2 < text.length,防止索引接近字符串末尾时,访问index+1或index+2导致数组越界异常。 - 参数解构:
(index, char)是对IndexedValue<Char>的解构,直接获取当前元素的索引和对应字符。 - 逻辑匹配:和你原有的Java风格逻辑完全一致,通过索引访问后续位置的字符来完成多条件判断。
如果不想用withIndex(),也可以手动计算索引,但这种方式存在缺陷:
text.indexOfFirst { char -> val index = text.indexOf(char) index != -1 && index + 2 < text.length && char in punctuationChars && text[index + 1].isWhitespace() && text[index + 2].isUpperCase() }
当字符串中有重复字符时,text.indexOf(char)只会返回第一个匹配的索引,导致后续相同字符的判断出错,因此更推荐第一种withIndex()的写法。
内容的提问来源于stack exchange,提问作者fckNewbee
相关产品推荐
相关产品推荐

