如何将 java.util.stream.Stream<Something> 转换为 kotlin.Sequence<Something>

15
Java 8 Streams非常强大,但在不需要并行处理时,使用Kotlin Sequence似乎更加简单易用。 有没有一种方式可以将stream.sequential()转换为Sequence呢?

这里提供一个示例,也可以在“保持懒惰”的部分中查看:https://dev59.com/bJTfa4cB1Zd3GeqPTJ3C#35722167 - Jayson Minard
2个回答

18
你可以从流中获取一个迭代器,然后将迭代器包装成一个Sequence:
你可以从流中获取一个迭代器,然后将迭代器包装成一个Sequence:
Sequence { stream.iterator() }
UPD: 从 Kotlin 1.1 开始,您可以使用 Stream.asSequence() 扩展(请参见Michael Richardson 的答案),它与上面的代码完全相同。该扩展还适用于专业流: IntStreamLongStreamDoubleStream
它位于 kotlin.streams 包中的 kotlin-stdlib-jdk8 库(Kotlin 1.2 及以上版本)或在 kotlin-stdlib-jre8 库中(仅限 Kotlin 1.1,在 Kotlin 1.2 及以上版本中已弃用)。

3
太好了!我看到还有Iterator<T>.asSequence()这个方法,所以我可以这样写: stream.iterator().asSequence() - atok
4
没问题,几乎是一样的。区别在于对 Stream 调用 iterator() 函数时,是立即执行 (asSequence()) 还是惰性执行 (Sequence { })。 - Ilya

9

Kotlin提供了一个扩展方法asSequence(),可以将Java流转换为Kotlin序列。根据我的经验,在我添加了一个导入语句之后,这个方法才被发现:

import kotlin.streams.*

然后按预期使用即可:

val seq = stream.asSequence()

他们改了这个导入吗?似乎不起作用。 - weston
@weston 这个链接似乎仍然存在 https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.streams/java.util.stream.-stream/as-sequence.html - Michael Richardson
谢谢,我解决了。AS中的新Kotlin项目依赖于std lib。它不应该这样做。移除它就解决了问题。 - weston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接