Scala相当于java.util.stream

时间:2014-06-27 03:40:10

标签: java scala stream

是否存在类似于java.util.stream.Stream的Scala类型(可能是特征)?

(我使用的是更好支持的Java 7,因此我无法使用Java 8的Stream。)

具体来说,它必须是一般类型,可以某种方式迭代,并且可以关闭。

try {
  stream.foreach(println)
  }
} finally {
  stream.close()
}

标准库中的解决方案将是首选,但另一个库中的某些内容是可以接受的。

1 个答案:

答案 0 :(得分:4)

对于集合,Scala中的所有集合都可以像流一样使用。在Scala中,Iterable / Iterator上的运算符会被懒惰地应用,例如,您还有ViewsStreamStream是一个懒惰的评估{{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适配器更好的形状和更惯用,但是因为我是作者,所以带着一点点盐:-)