takeWhile 包括与谓词匹配的实际值 (takeWhileInclusive)

2023-12-14

我经常看到这样的问题:我想从列表中收集值直到值匹配,但我也需要匹配值本身。尽管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注册它是否找到匹配...当我阅读评论(“假设顺序”)时,我也有点不确定这个实现是否真的有意义/真的安全。


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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

takeWhile 包括与谓词匹配的实际值 (takeWhileInclusive) 的相关文章

随机推荐

  • 执行多重响应;如何从响应中读取和存储指南

    我正在使用 ExecuteMultipleResponse 方法使用 SSIS 一次插入 10 条帐户记录 List
  • 什么是算法摊销分析? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 它与渐近分析有何不同 你什么时候使用它 为什么 我读过一些似乎写得很好的文章 例如 http www ugrad cs ubc ca cs320 2010W2 handouts
  • 无法进行空手道测试

    我无法在我的功能中运行空手道测试 package api import com intuit karate junit4 Karate import org junit runner RunWith RunWith Karate class
  • Linux下如何删除包含其他子目录和文件的目录?

    我有一个包含文件和其他目录的目录 我需要在一个命令中删除所有内容 但如果我确定要删除 i 则无需询问我每个文件 有什么命令吗 您需要递归删除该文件夹 rm r folder name From rm help r R recursive r
  • 如何从Python中的列表构造矩阵?

    我是 Python 新手 我的问题是如何从一些列表构造矩阵 例如 如果我有列表 388 625 174 125 157 25 166 375 432 25 606 125 326 25 202 75 383 5 718 25 630 284
  • 如何将 pandas 方法作为参数传递?

    我有一个计算 pandas 数据框的列模式的函数 def my func df for col in df columns stat df col mode print stat 但我想让它更通用 以便我可以更改我计算的统计数据 例如mea
  • ggplot2 中的默认中断 - 图例指南和极坐标 y 轴标签的中断限制在哪里

    这本质上是一个后续问题ggplot 如何计算其默认中断 当我试图找到一个稍微更优雅的解决方案时 我遇到了这个如何在coord 极坐标图ggplot中添加y轴标签 显然 休息时间总是用以下方式计算scales extended breaks
  • C# 从 Azure 检索 blob 列表

    我需要一些存档清理代码来在一定的保留期过后删除旧的 Azure 日志 我知道我可以这样做 CloudStorageAccount storageAccount CloudStorageAccount Parse CloudBlobClien
  • 修改x轴位置

    当你使用plot在 Matlab 中调用函数时 y 轴和 x 轴分别位于左侧和底部 但我希望 x 轴在图的中间穿过 比例和数字如下所示 请原谅我的业余绘画技巧 但基本上我希望 x 轴移动到顶部 例如 我希望那里有数字和那些小凸起 如红线所示
  • 如何使用计时器替换Azure辅助角色中的Thread.Sleep(...)?

    有很多人说要使用的例子Timer代替Thread Sleep in an Azure Worker Role 没有问题 我很难理解的是如何编写这个代码 目前 我有以下 伪代码 timer Elapsed sender args gt DoW
  • 记住状态 chrome 扩展

    我使用 chrome 扩展来触发两个内容脚本来注入 css 如果用户打开页面 则 contentscript on js 加载 在我的 manifest json 中定义 清单 json name tools version 1 1 des
  • AngularJS 路由器配置不起作用

    我刚刚开始学习 Angular JS 我编写了一些路由测试代码 但似乎不起作用 演示应用程序 js var demoApp angular module demoApp demoApp config function routeProvid
  • 在 Ionic 中打开适用于 Android 的应用程序

    我目前正在使用 Ionic Framework 开发适用于 iOS 和 Android 的移动应用程序 我有自己的 Map API 但缺乏导航功能 当用户单击 POI 时 我的应用程序可以打开其他地图应用程序 例如 Google 地图或 W
  • Chart.js yAxes 刻度步长不起作用(小提琴)

    我创建了一个折线图 其中 y 轴选项如下 yAxes ticks precision 1 stepSize 18 1 min 148 5 max 220 9 因此 我希望 y 轴比例如下 220 9 202 8 184 7 166 6 14
  • 使用 Android proguard 忽略外部库

    我想使用 Proguard 主要是出于混淆的原因 我在 Android 中遇到了 proguard 的问题 我使用simpleframework来解析XML 它的外部 在 proguard cfg 中 keepattributes Anno
  • jsf登录超时

    好的 简单的问题 我有一个 JSF 应用程序 包含一个登录页面 问题是 如果用户加载登录页面 离开一段时间 然后尝试登录 会话就会过期并引发 ViewExpiredException 当发生这种情况时 我可以重定向回登录 但这不是很顺利 如
  • 检查 Javascript 中的时差

    如何检查 Javascript 中两个文本框的时差 凑合 减去 JavaScriptDate对象以获得它们的差异 use a constant date e g 2000 01 01 and the desired time to init
  • WinSCP 批处理文件无法工作,但可以在 CMD 中手动工作

    我的脚本 cd C Users Administrator Downloads WinSCP 5 9 2 Portable winscp com command open ftp test email protected cd facomm
  • 如何在@BeforeSuite中使用testNG @Parameters读取资源文件

    我在用testNG with Selenium webdriver2 0 In my testNG xml I have
  • takeWhile 包括与谓词匹配的实际值 (takeWhileInclusive)

    我经常看到这样的问题 我想从列表中收集值直到值匹配 但我也需要匹配值本身 尽管takeWhile就这一点来说几乎是完美的 它实际上不允许保留最后一个 或基本上匹配的 条目 一个简单的示例 显示对象的类层次结构 直到实现特定接口的第一个类 g