延迟流操作和stream()的未解析引用

Ale*_*lov 3 java kotlin java-stream

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

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

所以问题是:你是否会使收集功能变得懒惰?为什么我不能访问该stream()方法?

hot*_*key 9

  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>可以使用方法从Iterable<T>(每个Collection<T>都是)创建A asSequence():

    val l = ArrayList<String>()
    val sequence = l.asSequence()
    
    Run Code Online (Sandbox Code Playgroud)

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


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

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