【问题标题】:Scala equivalent of java.util.streamScala 等价于 java.util.stream
【发布时间】:2014-08-18 01:49:49
【问题描述】:

是否有类似于java.util.stream.Stream 的 Scala 类型(可能是 trait)?

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

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

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

标准库中的解决方案将是首选,但其他库中的解决方案也可以接受。

【问题讨论】:

  • 我不明白为什么他们会否决一个好问题?可能对他们来说没有意义,但对你来说是有意义的。他们只是投反对票而不是提供帮助
  • 是的,@KickButtowski,我最近看到它发生了很多,对我自己和其他人都是如此。很奇怪。
  • @univerio,无法关闭释放底层资源(sockets、文件句柄等)

标签: java scala stream


【解决方案1】:

对于集合,Scala 中的所有集合都可以像流一样使用。在 Scala 中,Iterable / Iterator 上的运算符是惰性应用的,例如,您还拥有 ViewsStreamStream 是一个惰性求值的 List 并对遍历的值进行记忆,所以如果你想要记忆,你可以使用流,但由于内存要求,这对于使用无限流来说很棘手 - 仍然很酷)。

但是,您可能已经注意到,这并不能处理所有情况,因为流可能是来自网络套接字、文件句柄等的数据流。因此,需要处理使用的底层资源。

我不知道直接的等价物,但是我还必须提到我不喜欢 Java 的流,因为 Java 的流是用于处理可迭代序列的,这意味着它们当前的设计是基于拉取的。这在未来可能会发生变化,但是在处理流时,尤其是涉及 I/O 的流时,最好采用非阻塞和异步的方式,因此我更喜欢基于推送的方法,例如 Iteratees 或响应式扩展 (Rx) 模式。

在这方面,Scala/Java 生态系统正在发生很多事情。有RxJava,这是一个 Rx.NET 端口。还有Akka Streams,这是Reactive Streams 工作的一部分,旨在为背压指定可互操作的协议 - 在实验/alpha 阶段。

还有一个无耻的促销活动 - 我正在开发 Monifu,这是一个 Scala 的 Rx 实现,它可以实现背压,并且还将与“反应式流”协议集成。而且我还认为它已经比 RxJava 的 RxScala 适配器具有更好的形式和更惯用的形式,但是由于我是作者,因此请持保留态度:-)

【讨论】:

  • Scala 中也有 Stream[T],仅供记录。
  • @ErikAllik 是的,但它是一种不同的流。 Stream[T] 在对其应用操作时会进行惰性求值,但最大的区别在于 Stream[T] 对遍历的值进行记忆 - 基本上是对 List[T] 进行惰性求值。如果您想要记忆化,这很有价值,但它不适合处理无限流,因此它绝不是等价的。最接近 Java 的流实际上是 Iterable[T]
  • @ErikAllik 为了完整起见,我添加了一个提及。感谢您的建议。
  • 我知道你提到的差异;只是觉得值得一提;另外,我认为Stream 即使对于无限流也可以,如果您不无限期地保留对流的原始头部的引用。尽管在某些性能关键的情况下,这可能性能不够,但可能有助于在其他一些短期记忆有用的情况下设计更简单的算法。
  • @ErikAllik 是的,你说得对,我已经为它添加了提及。感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
相关资源
最近更新 更多