如何修改 Kotlin 序列的前缀但保留尾部?

2024-03-20

Kotlin 提供take and takeWhile先采取的方法n的项目Sequence<T>并将它们作为另一个序列单独处理,例如,drop他们中有一些,map到其他值等

但是当我使用take and takeWhile,序列的尾部被丢弃。

现在,给定一个一度受限序列,如何将其任意前缀转换为保留尾部的另一个序列(如果它仍然存在)?

Example:

val seq = (1..10).asSequence().constrainOnce() 
// emits 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

val modified = seq.changePrefix { take(5).map { -1 * it } }
// emits -1, -2, -3, -4, -5, 6, 7, 8, 9, 10

如何对多个前缀执行相同的操作?

Example:

val seq = (1..10).asSequence().constrainOnce()

val modified = seq.changePrefixes(
        { take(3).map { it * -1 } },
        { drop(1).take(3).map { it * 100 } },
        { map { 0 } }
)

//emits -1, -2, -3, 500, 600, 700, 0, 0, 0

注意:这个问题是故意提出的作者回答 https://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/.


When a Sequence<T>是一次约束的,这意味着不允许创建多个Iterator从中。因此,解决方案是创建一个迭代器并从中生成更改的前缀和剩余的尾部。

The Iterator<T>'s asSequence() https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/kotlin.-iterator/as-sequence.html方法在这里被证明是有用的,因为它创建了一个由迭代器支持的序列。剩下的就是连接序列。

以下是进行一项更改的方法:

val seq = (1..10).asSequence().constrainOnce()
val modified = seq.iterator().let { iter -> 
    iter.asSequence().take(5).map { it * -1 } + iter.asSequence()
}

请注意,两个序列是从同一个迭代器创建的,但没关系,因为

  • Sequences 被懒惰地求值
  • 两个序列一起使用,不会泄露
  • 对串联中的第二个序列的评估将在第一个序列完成后开始

以下是如何将其推广到任意数量的序列运算符:

fun <T> Sequence<T>.changePrefixes(vararg operators: Sequence<T>.() -> Sequence<T>)
: Sequence<T> {
    val i = iterator()
    return operators.fold(emptySequence<T>()) { acc, it -> acc + i.asSequence().it() } + 
            i.asSequence()
}

This fold产生由以下提供的串联序列链operators来自迭代器支持的序列i,然后将未修改的尾部附加到fold result.

此实现的局限性在于,当运算符包含takeWhille,被拒绝的项目将被丢弃,并且不会被发送到下一个序列中。

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

如何修改 Kotlin 序列的前缀但保留尾部? 的相关文章

  • 如何获取 LinkedHashMap 的 keyIterator?

    通过查看Sun的LinkedHashMap的源代码 我发现有一个名为Key Iterator的私有类 我想使用它 我怎样才能获得访问权限 您可以通过致电获取 myMap keySet iterator 你甚至不需要知道它的存在 它只是实现的
  • 有没有办法理解安装错误代码的实际含义?

    我正在尝试应用内更新功能 但收到 FAILED 安装状态和 100 安装错误代码 有什么办法让我知道可能是什么原因造成的吗 我实现了灵活的应用内更新 并记录了每个步骤 遵循 Android 开发者教程here https developer
  • Kotlin:使用地图变换时 {} 和 () 之间的区别?

    我是科特林新手 我总是使用带花括号的地图变换 然后 为什么这有效 gt val x someList map SomeConstructor 这不是吗 val x someList map SomeConstructor 我在在线教程的任何
  • 如何让 Kotlin 类型安全构建器在 Scala 中工作?

    Kotlin 很棒类型安全的构建者 https kotlinlang org docs reference type safe builders html这使得创建像这样的 dsl 成为可能 html head title The titl
  • 如何在 GitHub Actions 上运行 Kotlin 脚本?

    我想在 CI 中运行 Kotlin 脚本而不依赖于 Gradle 项目 这样我就可以轻松地执行使用 shell bash batch 难以编程的操作 并且可以在需要时使用库 让 Kotlin 脚本仅在 Ubuntu Linux 上运行是可以
  • Android Studio 中过时的 Kotlin 运行时警告

    下载并安装最新的 Kotlin 插件后 我有过时的 Kotlin 运行时来自 Android Studio 的警告告诉我 您在 kotlin stdlib 1 1 2 库中的 Kotlin 运行时版本是 1 1 2 而插件版本是1 1 2
  • 使用 lambda 或 Stream API 合并流以生成交替序列

    我有一些按预期返回 Stream 的代码 但也许可以用某种类型的 lambda 或 stream 操作替换它 而不是耗尽 a 中的迭代器while loop 它只是一种交替流中元素的方法first and second当其中一个元素耗尽时停
  • JobService 在 android 9 中不会重新安排

    我正在尝试让我的应用程序在 Android 9 上运行 以下代码在 Android 8 上运行良好 但由于某种原因 JobService 不会在 android 9 上重新安排 它第一次被安排 但不会根据到设定的周期 class Retri
  • ktor 客户端发布多部分/表单数据

    如何使用 ktor 客户端将文件作为多部分 表单数据发布 我想将它用于电报机器人 API 发送文档 我需要获得与curl命令相同的结果 curl F document path to some file https api telegram
  • kotlin中的三元运算符[重复]

    这个问题在这里已经有答案了 我可以用java写 int i 10 String s i 10 Ten Empty 即使我可以将它传递到方法参数中 callSomeMethod i 10 Ten Empty 如何将其转换为 kotlin 在
  • 如何在Android首选项中正确接收和存储本地目录/路径?

    我想存储一个本地路径 内部或外部存储 用户可以在其中存储一些数据作为 Android 应用程序中的首选项 我希望用户在首选项中选择一个首选文件夹 默认文件夹是context externalMediaDirs它返回一个File我将其绝对路径
  • 方案中的尾递归幂函数

    我在方案中编写尾递归幂函数时遇到问题 我想使用辅助函数来编写该函数 我知道我需要一个参数来保存累计值 但在那之后我就陷入了困境 我的代码如下 define pow tr a b define pow tr h result if b 0 r
  • 我怎样才能制作自己的惰性迭代器?

    我正在创建一个生成大量数据的 C 11 类 该数据当前来自数据库 无法完全放入内存中 我想为用户提供一个行为类似于常规 STL 迭代器的迭代器 但这会很懒 更准确地说 我可以做这样的事情 for auto item big bunch of
  • Android Mockito.verify 说参数不同!打印相同内容

    情况 我有一个界面Tracker其中有这个方法 fun trackEvent event String args Bundle null 我想验证是否使用特定的调用此方法event 被测试的内部对象调用此方法Bundle目的 所有事件都指定
  • oracle日期序列?

    我有一个 oracle 数据库 我需要一个包含 2 年所有日期的表 例如来自01 01 2011 to 01 01 2013 首先我想到了一个序列 但显然唯一支持的类型是数字 所以现在我正在寻找一种有效的方法来做到这一点 欢呼骗局 如果您想
  • java.util.ConcurrentModificationException 和迭代?

    我对数组列表和迭代器非常陌生 这是我第一次遇到这个异常 我有一个 ArrayList u 我想做以下算法 for Character c u if k 1 base case if isAnswer s u get 0 System out
  • 当目标是属性时,@Throws 不起作用

    在看的同时这个问题 https stackoverflow com q 47737288 7366707 我注意到申请 Throws to a get or setuse site 没有影响 此外 唯一有效的目标 for Throws ar
  • 使用 Kotlin 协程替换 LocalBroadcastManager 以进行 Firebase 消息传递

    使用时Firebase 云消息传递 https firebase google com docs cloud messaging android client在 Android 上 通常需要通知当前Activity传入的推送通知 推荐的方法
  • Kotlin 协程阻塞 Android 中的主线程

    我是 Kotlin 和协程的新手 我有一个fun在我的活动及其内部 检查User用户名和密码 如果为真 则返回Users object 一切都好 但是当我按下按钮时 我的活动被阻止并等待响应Users login 我用这个有趣的 priva
  • 为什么线程比协程表现出更好的性能?

    我编写了 3 个简单的程序来测试协程相对于线程的性能优势 每个程序都会执行许多常见的简单计算 所有程序都彼此分开运行 除了执行时间之外 我还通过以下方式测量了 CPU 使用率Visual VMIDE 插件 第一个程序使用以下方法进行所有计算

随机推荐