gpt4 book ai didi

kotlin - takeWhile 包含与谓词匹配的实际值 (takeWhileInclusive)

转载 作者:行者123 更新时间:2023-12-02 13:21:14 25 4
gpt4 key购买 nike

我经常看到我想从列表中收集值直到值匹配的问题,但我也需要匹配值本身。而 takeWhile 在这方面几乎是完美的,它实际上不允许保留最后一个(或基本上是匹配的)条目。

一个简单的例子:显示对象的类层次结构,直到实现特定接口(interface)的第一个类

generateSequence(obj::class.java, Class<*>::getSuperclass)
.takeWhile { interestedType !in it.interfaces }
.joinToString(" > ")
.run(::println)

对于 obj=arrayListOf(1)interestedType=Collection::class.java我想看到类似的东西:
class java.util.ArrayList > class java.util.AbstractList > class java.util.AbstractCollection

我希望它会像这样简单:
generateSequence(obj::class.java, Class<*>::getSuperclass)
.takeWhileInclusive { interestedType !in it.interfaces }
.joinToString(" > ")
.run(::println)

但是这样的功能不存在(还没有?)。但也许还有其他一些功能真正接近于此?或者也许最多有 2 个连续的函数调用它已经很容易实现而我只是没有看到它?

我不是在寻找什么:我如何解决关于层次结构中的哪个类实现接口(interface)的特定问题。这只是一个简单的例子。我也不在寻找的东西:如何使用 Iterator 实现它或基本的while-/for-loop ...(除了:如果它易于阅读并且不超过3行那么...也许;-))。

我发现了什么: Is this implementation of takeWhileInclusive safe?它还将其自己的实现(及其灵感)链接到 takeWhileInclusive .但是我不太喜欢它使用 var注册是否找到匹配项......当我阅读评论(“假设顺序”)时,我也有点不确定这个实现是否真的有意义/真的安全。

最佳答案

我还没有找到合适的现有函数,我也不太喜欢链接的解决方案,所以我玩了一下,最终得到了以下扩展函数:

fun <T> Sequence<T>.takeWhileInclusive(predicate: (T) -> Boolean) = sequence {
with(iterator()) {
while (hasNext()) {
val next = next()
yield(next)
if (!predicate(next)) break
}
}
}

它利用 sequence ,在需要时懒惰地产生值。至少我可以省略中间 var我认为这样可能会更有益......

关于kotlin - takeWhile 包含与谓词匹配的实际值 (takeWhileInclusive),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56058246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com