Ale*_*lov 3 java kotlin java-stream
我正在用kotlin开发一些日志分析工具.我有大量的传入日志,因此无法将它们全部加载到内存中,我需要以"管道"方式处理它们.我发现有两件事令我失望:
filter,map等)不懒惰.例如,我有1 GB的日志,并希望获得与给定正则表达式匹配的前十行的长度.如果按原样编写,过滤和转换将应用于内存中的整个千兆字节的字符串.l.stream(),我定义为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>可以使用方法从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()