惰性流操作和 stream() 的未解析引用

Lazy stream operations and unresolved reference for stream()

我正在用 kotlin 开发一些日志分析工具。我有大量传入日志,因此无法将它们全部加载到内存中,我需要以 "pipeline" 方式处理它们。 我发现有两件事让我很失望:

  1. 据我所知,kotlin 集合的所有类似流的方法(filtermap 等等)都不是懒惰的。例如。我有 1 GB 的日志,想要获取与给定正则表达式匹配的前十行的长度。如果我按原样编写,过滤和转换将应用于内存中整个千兆字节的字符串。
  2. 我不会写l.stream(),其中我定义为val l = ArrayList<String>()。编译器说:"Unresolved reference: stream".

所以问题是:你打算让集合函数惰性化吗?为什么我不能访问 stream() 方法?

  1. Kotlin 不使用 Java 8 Streams,取而代之的是惰性 Sequence<T>. It has API mostly unified with Iterable<T>, so you can learn more about its usage .

    Sequence<T> 类似于 Stream<T>,但它在顺序数据方面提供了更多(例如 takeWhile),尽管它目前不支持并行操作*。

    引入 Stream API 替代品的另一个原因是 Kotlin 的目标是 Java 6,它没有 Streams,所以他们 were dropped 来自 Kotlin stdlib 支持 Sequence<T>.

  2. 可以使用 asSequence() 方法从 Iterable<T>(每个 Collection<T> 都是)创建 Sequence<T>

    val l = ArrayList<String>()
    val sequence = l.asSequence()
    

    这相当于 Java 中的 .stream(),可以让您延迟处理集合。否则,转换会急切地应用于集合。


* 如果需要,解决方法是回滚到 Java 8 Streams:

(collection as java.lang.Collection<T>).parallelStream()