我经常看到这样的问题:我想从列表中收集值直到值匹配,但我也需要匹配值本身。尽管takeWhile就这一点来说几乎是完美的,它实际上不允许保留最后一个(或基本上匹配的)条目。
一个简单的示例:显示对象的类层次结构,直到实现特定接口的第一个类
generateSequence(obj::class.java, Class<*>::getSuperclass)
.takeWhile { interestedType !in it.interfaces }
.joinToString(" > ")
.run(::println)
for obj=arrayListOf(1)
and 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 个连续的函数调用,它已经很容易实现,但我只是没有看到它?
我不是在寻找:如何解决有关层次结构中哪个类实现接口的特定问题。这只是一个简单的例子。我也不是在寻找:我如何实现它Iterator
或者一个基本的 while/for 循环...(除非:如果它很容易阅读并且不超过 3 行那么...也许;-))。
我发现了什么:takeWhileInclusive 的这种实现安全吗?它还将其自己的实现(及其灵感)联系起来takeWhileInclusive
。但是我真的不喜欢它使用var
注册它是否找到匹配...当我阅读评论(“假设顺序”)时,我也有点不确定这个实现是否真的有意义/真的安全。