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

我正在用kotlin开发一些日志分析工具。 我有大量的传入日志,所以它不可能加载到内存中,我需要以“管道”的方式处理它们。 我发现了两件令我失望的事情:

  1. 据我所知,kotlin集合( filtermap等)的所有类流方法都不是懒惰的。 例如,我有1 GB的日志,并希望得到匹配给定正则表达式的前十行的长度。 如果按原样写入,则过滤和转换将应用于内存中的整个千兆字节的字符串。
  2. 我不能写l.stream() ,其中l定义为val l = ArrayList<String>() 。 编译器说:“未解决的参考:流”。

所以问题是:您是否要使收集功能懒惰? 为什么我不能访问stream()方法?

  1. Kotlin不使用Java 8 Streams,而是有懒惰的Sequence<T> 。 它的API大部分与Iterable<T>统一,所以你可以在这里了解更多关于它的用法。

    Sequence<T>类似于Stream<T> ,但是当涉及到顺序数据(例如takeWhile )时,它提供了更多的功能,尽管目前没有并行操作支持。

    引入Stream API替换的另一个原因是Kotlin的目标是没有Streams的Java 6,所以它们被 Kotlin stdlib从Sequence<T> 中删除 。

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

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

    这相当于Java中的.stream() ,可以让你懒懒地处理一个集合。 否则,转换是热切地应用于一个集合。


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

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