You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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()
}

关键说明

  1. 边界检查:必须先判断index + 2 < text.length,防止索引接近字符串末尾时,访问index+1或index+2导致数组越界异常。
  2. 参数解构:(index, char)是对IndexedValue<Char>的解构,直接获取当前元素的索引和对应字符。
  3. 逻辑匹配:和你原有的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:01:06