将java.util.stream.Stream转换为Scala Stream

Arn*_*rne 3 collections scala scala-collections

我知道如何使用Java库,我可以编写一些循环来完成我需要的东西,但问题是更多,为什么没有内容scala.collection.JavaConverters或scala.collection.JavaConverstions将a转换java.util.stream.Stream为scala.collection.immutable.Stream?

我想做这样的事情:

def streamFiles(path: Path): Stream[Path] = {
    Files.newDirectoryStream(path).asScala
}
Run Code Online (Sandbox Code Playgroud)

但相反,我必须写这样的东西:

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)
}
Run Code Online (Sandbox Code Playgroud)

mar*_*ira 10

由于路线图的不同,当前版本JavaConverters并且JavaConversions不提供Java Stream和Scala Stream之间的转换.

Java 8,即java.util.stream.Stream推出的版本,于2014年3月发布,而Scala 2.11.0于2014年4月正式发布.因此,没有时间更改Scala 2.11计划以增加与Java 8功能的更好集成.事实上,Scala 2.12计划为Java 8提供更好的支持(参见此处的路线图以及Adrian Moors的演示文稿).

但无论如何,有scala-java8-compat,"用于Scala的Java 8兼容工具包",并且在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
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您仍想将其转换java.util.stream.Stream为Scala Stream,请将scala-java8-compat版本0.8.0-RC3或更新版本添加到您的项目中(您可能还需要为您的构建添加一个新的解析器),然后执行以下操作:

import scala.compat.java8.StreamConverters._

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