我正在用kotlin开发一些日志分析工具。我有大量的传入日志,因此无法将它们全部加载到内存中,我需要以“管道”方式处理它们。 我发现有两件事令我失望:
filter
,map
等所有类似流的方法都不是懒惰的。例如。我有1 GB的日志,并希望获得与给定正则表达式匹配的前十行的长度。如果我按原样编写,过滤和转换将应用于内存中的整个千兆字节的字符串。l.stream()
,其中l定义为val l = ArrayList<String>()
。编译器说:“未解决的参考:流”。所以问题是:你是否会使收集功能变得懒惰?为什么我无法访问stream()
方法?
答案 0 :(得分:9)
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>
。
可以使用asSequence()
方法从Sequence<T>
(每Iterable<T>
个}创建Collection<T>
:
val l = ArrayList<String>()
val sequence = l.asSequence()
这相当于Java中的.stream()
,可以让你懒惰地处理一个集合。否则,转换将热切地应用于集合。
*如果需要,解决方法是回滚到Java 8 Streams:
(collection as java.lang.Collection<T>).parallelStream()