流()

时间:2016-02-16 08:33:12

标签: java java-stream kotlin

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

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

1 个答案:

答案 0 :(得分:9)

  1. Kotlin不使用Java 8 Streams,而是使用惰性Sequence<T>。它的API主要与Iterable<T>统一,因此您可以详细了解其使用情况here

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

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

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

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

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

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

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