收集/过滤所有项目,直到满足Kotlin列表中的条件

tuwxkamq  于 2023-08-06  发布在  Kotlin
关注(0)|答案(2)|浏览(131)

我有一个项目列表/序列,例如[a_0, a_1, a_3, a_4,...,a_n]
我有一个 predicate (a) -> Boolean,其中a_i是 predicate 返回true的第i个位置的第一个元素。记住索引i预先已知。
有没有一个简单的解决方案可以使用stdlib中的单个操作符或stdlib中的操作符集合来获取子列表[a_0, a_1, a_3,...,a_i]
我不想维护一个变量来检查我们是否命中了满足条件的第一个元素,因为这看起来不好或功能不好,或者为此创建一个函数自定义函数
TLDR
我想要一个来自stdlib的操作符(或一组操作符),其行为如下:当calculateIndex()返回3时,listOf(1, 2, 3,...n).takeTill { i >= calculateIndex() }应该返回[1, 2, 3]

tzxcd3kk

tzxcd3kk1#

您可以在所有列表上使用Kotlin扩展来执行您正在寻找的功能

fun <T> List<T>.takeTill(condition: (T) -> Boolean): List<T> {
    val result = mutableListOf<T>()
    for ((i, value) in withIndex()) {
        result.add(value)
        if (condition(value)) {
            break
        }
    }
    return result
}

字符串
使用符合您的要求:第一个月

e5nqia27

e5nqia272#

你两者都有

  • .take(n: Int)类似于.take(3),它只返回前n个元素
  • .takeWhile(predicate: (T) -> Boolean),返回第一个元素,直到条件被违反。像.takeWhile { it.startsWith("a") }

相关问题