在kotlin流处理

asc*_*erk 2 collections stream kotlin

  • Kotlin如何处理以下代码?
  • 是否会创建5000000个整数的集合作为临时集合,或者过滤器会立即将其结果提供给forEach哪个,这意味着只会查看20个整数?
  • 如果没有,我怎么能避免中间收集?

码:

class Tests {
    @Test
    fun test() {
        var counter = 0
        (1..10_000_000).filter { it % 2 == 1 }.forEach {
            counter++
            if (counter > 10)
                return
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

hot*_*key 5

您的代码示例使用操作Iterable<T>,该操作急切地工作:.filter { ... }调用将处理整个范围并生成存储中间结果的列表.

要改变这种情况,请考虑使用Sequence<T>(例如with .asSequence())懒惰地工作,以便中间操作例如.filter { ... }产生另一个懒惰序列,并且仅在终端操作查询项目时执行工作,例如.forEach { ... }:

(1..10000000).asSequence()
    .filter { it % 2 == 1 } 
    .forEach { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

请参阅:Kotlin的Iterable和Sequence看起来完全相同.为什么需要两种类型?