为什么在 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
sequence
builder 允许您在协程中使用简单的顺序语法创建复杂的惰性项目序列。很强大。
- 他们可以追溯到 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(使用前将#替换为@)