是否存在类似于java.util.stream.Stream
的Scala类型(可能是特征)?
(我使用的是更好支持的Java 7,因此我无法使用Java 8的Stream
。)
具体来说,它必须是一般类型,可以某种方式迭代,并且可以关闭。
try {
stream.foreach(println)
}
} finally {
stream.close()
}
标准库中的解决方案将是首选,但另一个库中的某些内容是可以接受的。
答案 0 :(得分:4)
对于集合,Scala中的所有集合都可以像流一样使用。在Scala中,Iterable
/ Iterator
上的运算符会被懒惰地应用,例如,您还有Views和Stream(Stream
是一个懒惰的评估{{1}并且记录了遍历的值,所以如果你想要memoization你可以使用一个流,但是由于内存需求,这对于使用无限流来说很棘手 - 它仍然非常酷。)
然而,您可能已经注意到,这并没有处理所有情况,因为流可能是来自网络套接字,文件句柄等的数据流。因此,需要处理所使用的底层资源。
我不知道直接的等价物,但是我还必须提到我不喜欢Java的流,因为Java的流用于处理可迭代序列,这意味着他们当前的设计是拉基。这可能在将来发生变化,但在处理流时,尤其是涉及I / O的流时,最好采用非阻塞和异步,因此我更喜欢基于推送的方法,如Iteratees或Reactive扩展(Rx)模式。
在这方面,Scala / Java生态系统正在发生很多事情。有RxJava,这是一个Rx.NET端口。在实验/ alpha阶段,Akka Streams也是Reactive Streams努力指定背压的可互操作协议的一部分。
这是一个无耻的推广 - 我正在研究Monifu,这是一个针对Scala的Rx实现,它可以实现反压,并且还可以与" Reactive Streams"协议。而且我也认为它已经比RxJava的RxScala适配器更好的形状和更惯用,但是因为我是作者,所以带着一点点盐:-)