Kotlin:流与序列 - 为什么有多种方法来做同一件事?

2023-12-21

为什么在 Kotlin 中有多种方法可以做同样的事情,这是有原因的吗?

val viaSequence = items.asSequence()
    .filter { it%2 == 0 }
    .map { it*2 }
    .toList()
println(viaSequence)

val viaIterable = items.asIterable()
    .filter { it%2 == 0 }
    .map { it*2 }
    .toList()
println(viaIterable)

val viaStream = items.stream()
    .filter { it%2 == 0 }
    .map { it*2 }
    .toList()
println(viaStream)

我知道以下代码在每个步骤上都会创建一个列表,这会增加 GC 的负载,因此应该避免:

items.filter { it%2 == 0 }.map { it*2 }

Streams来自Java,Java中没有内联函数,因此Streams是在Java中的集合上使用这些函数链的唯一方法。 Kotlin 可以直接在 Iterables 上执行这些操作,这在许多情况下可以提高性能,因为不需要创建中间 Stream 或 Sequence 对象。

Kotlin 将序列作为 Streams 的替代品,具有以下优点:

  • 他们使用 null 来表示缺少的项,而不是Optional。由于具有 null 安全功能,可空值在 Kotlin 中更容易使用。避免包装集合中的所有项目也能提高性能。
  • 一些运算符和聚合函数更加简洁,并且避免了必须处理泛型类型(比较Sequence.groupBy to Stream.collect).
  • 为序列提供了更多的运算符,这通过消除中间步骤带来了性能优势和更简单的代码。
  • 许多终端运算符都是内联函数,因此它们省略了 Stream 所需的最后一个包装器。
  • The sequencebuilder 允许您在协程中使用简单的顺序语法创建复杂的惰性项目序列。很强大。
  • 他们可以追溯到 Java 1.6。流需要 Java 8 或更高版本。这与 Kotlin 1.5 及更高版本无关,因为 Kotlin 现在需要 JDK 8 或更高版本。

另一个答案提到了 Streams 的优点。

在大多数情况下,为了性能和代码清晰度,直接使用 Iterable 内联运算符函数而不是序列或流是最好的。除了当你使用sequence对于延迟生成项目的构建器,我会默认选择 Iterable 运算符,并且仅在存在需要优化的性能瓶颈时才考虑和试验序列。通常,您可能会发现无论如何都无法让 Sequence 方法比 Iterable 运算符表现得更好。

不错的文章在这里对它们进行了比较。 https://proandroiddev.com/java-streams-vs-kotlin-sequences-c9ae080abfdc

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

Kotlin:流与序列 - 为什么有多种方法来做同一件事? 的相关文章

随机推荐

  • 将 mongodb 返回对象转换为字典

    我将 Bottle 框架与 mongoengine 一起使用 我有一个订单模型 class OrderDetail Option orderDetailsQty FloatField def to dict self return mong
  • 对(flask-restful)GET API 调用进行单元测试时出现 500 INTERNAL SERVER ERROR

    我已经对我的 Flask restful API 模块中的所有方法进行了单元测试 现在我想通过实际进行 API 调用来测试 get 方法 我预计此测试会出现错误 400 我的资源类 class Response Resource marsh
  • WPF 本地化:使用 StringFormat 的动态资源?

    我正在使用 ResourceDictionary 在 NET 4 中进行本地化 有人有使用字符串格式的值的解决方案吗 例如 假设我有一个带有 SomeKey 键的值
  • 如何从 GameScene 中的 ViewController 调用方法

    我的 viewController 中有一个自定义 segue 的方法 如下所示 func gameOver performSegueWithIdentifier GameOver sender nil 我在 GameScene swift
  • MySQL表间自增

    在MySQL中 是否可以在两个不同的表中拥有自动递增的列 示例 table1 具有 secondaryid 列 table2 也具有 secondaryid 列 table1 secondaryid 和 table2 secondaryid
  • 以编程方式清除应用程序的数据

    我想以编程方式清除应用程序的数据 应用程序的数据可能包含数据库 共享首选项 内部 外部文件或应用程序内创建的任何其他文件等任何内容 我知道我们可以通过以下方式清除移动设备中的数据 设置 gt 应用程序 gt 管理应用程序 gt 我的应用程序
  • Angular2 ComponentRouter 防止自动组件重用[重复]

    这个问题在这里已经有答案了 文档https angular io docs ts latest guide router html https angular io docs ts latest guide router html stat
  • 咖啡脚本中的 switch case 语句

    我有几个不同的按钮调用相同的函数 我希望将它们包装在 switch 语句中 而不是使用一堆 else if 条件 任何帮助都会很棒 events click red blue black yellow openOverlay openOve
  • 如何计算Android项目中作为依赖项添加的库的大小

    我正在一个项目中使用多个库 例如 google play service retrofit gson glide twitter 和 facebook sdk 所以我想知道每个库在我的应用程序中占用的确切大小 请帮助我是否有任何可能的方法来
  • iOS 运动检测:运动检测灵敏度级别

    我有一个简单的问题 我正在尝试检测用户何时摇动 iPhone 我有标准代码来检测运动 这没有问题 然而 在我的实际手机上进行测试时 我意识到你必须用力摇动设备才能触发运动检测 我想知道是否有办法实施一定程度的敏感性检查 例如 一种检测用户是
  • SparkSQL 是 RDBMS 还是 NOSQL?

    最近和朋友讨论Spark SQL的特性时 遇到了这个问题 它们是 ACID 事务吗 Spark SQL 遵循 CAP 定理吗 我对这个领域有点陌生 请帮助我 提前致谢 SparkSQL 是一种查询语言 而不是像 Hive 或 MYSQL 那
  • Android OpenGL ES 和 2D

    嗯 这是我的要求 我还不知道OpenGL 而且我也不愿意学习它 我想直接学习OpenGL ES 因为我的开发目标是android 我想学习 OpenGL ES 以发展我的能力2D游戏 我选择它是出于性能目的 因为基本的 SurfaceVie
  • 名词、动词、形容词等的单独单词列表

    通常单词列表是 1 个包含所有内容的文件 但是是否有可单独下载的名词列表 动词列表 形容词列表等 我特别需要它们来学习英语 如果您只下载数据库文件wordnet princeton edu download 当前版本 https wordn
  • 多个字段的 Laravel SUM 使用原始查询返回 null

    以下是我的查询 sales DB table sales gt leftJoin category sales category sales sale id sales id gt leftJoin department sales dep
  • 使用javascript的最大子数组[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定一个整数数组 nums 找到连续的子数组 至少包含一个数字 其总和最大并返回其总和 Example 输入 2 1 3 4 1 2
  • 将外来字符更改为对应的罗马字符

    我正在使用 php 我想知道是否有一种预定义的方法可以将外来字符转换为非外来字符 字符如 一切都导致 e 我正在寻找一个函数 它接受一个字符串并返回它 不带特殊字符 任何想法将不胜感激 在找不到合适的转换器之后 我创建了自己的集合来满足我的
  • 调用 Windows 安全对话框(在 C# 或 VB.NET 中)

    我想知道如何调用 Windows 安全对话框 在 Windows 工作站上按 ctrl alt del注意 我不需要任务管理器 以编程方式 在 XP 工作站上 不必担心 Win7 或 Vista 最好有一个 C 快速示例 如果必须的话 也可
  • .remove() 在 Internet Explorer 中不起作用[重复]

    这个问题在这里已经有答案了 此代码在 Google Chrome 中运行良好 但在 Internet Explorer 中不起作用 document getElementsByClassName info i remove 有没有其他方法可
  • Shell 脚本来源:未找到

    我正在运行以下简单脚本来测试代码块 bin bash Load nvm and install latest production node source HOME nvm nvm sh nvm install v0 10 12 nvm u
  • Kotlin:流与序列 - 为什么有多种方法来做同一件事?

    为什么在 Kotlin 中有多种方法可以做同样的事情 这是有原因的吗 val viaSequence items asSequence filter it 2 0 map it 2 toList println viaSequence va