惰性流操作和stream()的未解析引用
我正在用kotlin开发一些日志分析工具。 我有大量的传入日志,所以它不可能加载到内存中,我需要以“管道”的方式处理它们。 我发现了两件令我失望的事情:
- 据我所知,kotlin集合(
filter
,map
等)的所有类流方法都不是懒惰的。 例如,我有1 GB的日志,并希望得到匹配给定正则表达式的前十行的长度。 如果按原样写入,则过滤和转换将应用于内存中的整个千兆字节的字符串。 - 我不能写
l.stream()
,其中l定义为val l = ArrayList<String>()
。 编译器说:“未解决的参考:流”。
所以问题是:您是否要使收集功能懒惰? 为什么我不能访问stream()
方法?
-
Kotlin不使用Java 8 Streams,而是有懒惰的
Sequence<T>
。 它的API大部分与Iterable<T>
统一,所以你可以在这里了解更多关于它的用法。Sequence<T>
类似于Stream<T>
,但是当涉及到顺序数据(例如takeWhile
)时,它提供了更多的功能,尽管目前没有并行操作支持。引入Stream API替换的另一个原因是Kotlin的目标是没有Streams的Java 6,所以它们被 Kotlin stdlib从
Sequence<T>
中删除 。 -
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()