【问题标题】:Convert java.util.stream.Stream to Scala Stream将 java.util.stream.Stream 转换为 Scala Stream
【发布时间】:2016-11-24 00:32:06
【问题描述】:

我知道如何使用 Java 库,并且我可以编写一些循环来完成我需要的东西,但问题更多,为什么 scala.collection.JavaConvertersscala.collection.JavaConverstions 中没有任何内容来转换 @ 987654323@ 到scala.collection.immutable.Stream

我想做这样的事情:

def streamFiles(path: Path): Stream[Path] = {
    Files.newDirectoryStream(path).asScala
}

但是我必须写这样的东西:

def streamFiles(path: Path): Stream[Path] = {
  val path_it : java.util.Iterator[Path] = Files.newDirectoryStream(path).iterator()
  def loop(it: java.util.Iterator[Path]): Stream[Path] =
    if( it.hasNext )
     it.next #:: loop(it)
    else
      Stream()
  loop(path_it)
}

【问题讨论】:

  • 您的问题不清楚。哪个流(Java 8 或 Scala)?这里有什么问题?你已经尝试过做什么?
  • Java8 流到 Scala 流的转换。所以两者兼而有之。我认为这会很清楚。
  • 不是。请重写您的问题,最好使用一些与您想要实现的目标相关的代码。
  • @marcospereira 我添加了一些代码。我希望您现在对此感到非常满意,并很高兴能给我一个很好的答案。
  • 已回答,因为其他用户可能也需要此类信息。

标签: scala collections scala-collections


【解决方案1】:

由于路线图的不同,JavaConvertersJavaConversions 的当前版本不提供 Java Stream 和 Scala Stream 之间的转换。

引入java.util.stream.Stream 的Java 8 版本是released at Mar 2014,而Scala 2.11.0 是officially released at Apr 2014。因此没有时间更改 Scala 2.11 计划以添加与 Java 8 功能的更好集成。事实上,Scala 2.12 计划对 Java 8 提供更好的支持(参见 roadmap herepresentation from Adrian Moors)。

但不管怎样,有scala-java8-compat,“Scala 的Java 8 兼容工具包”,还有experimental support in Scala 2.11

查看您的代码,有一个相关问题:Files.newDirectoryStream 返回一个DirectoryStream,它不是java.util.stream.Stream 的子接口,而是一个Iterable。因此,您需要一种将Iterable 转换为Scala Stream 的方法,如果这是您真正想要的,并且您的代码应该是这样的:

import java.nio.file.Path
import java.nio.file.Files

import scala.collection.JavaConverters._

object Foo {
  def streamFiles(path: Path): Stream[Path] = {
    Files.newDirectoryStream(path).iterator().asScala.toStream
  }
}

但如果您仍想将 java.util.stream.Stream 转换为 Scala Stream,请将 scala-java8-compat 版本 0.8.0-RC3 或更高版本添加到您的项目中(您可能需要 add a new resolver to your build too),然后执行以下操作:

import scala.compat.java8.StreamConverters._

val numbers: java.util.List[Int] = java.util.Arrays.asList(1, 2, 3)
numbers.stream().toScala[Stream]

【讨论】:

    猜你喜欢
    • 2015-02-05
    • 1970-01-01
    • 2019-11-08
    • 2022-11-28
    • 2018-10-23
    • 2021-02-11
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多