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

Convert java.util.stream.Stream to Scala Stream

我知道如何使用 Java 库,我可以编写一些循环来完成我需要的东西,但问题更多,为什么 scala.collection.JavaConverters 中什么都没有或 scala.collection.JavaConverstionsjava.util.stream.Stream 转换为 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)
}

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

Java8、版本所在java.util.stream.Stream was introduced, was released at Mar 2014 while Scala 2.11.0 was officially released at Apr 2014. So there was no time to change Scala 2.11 plans to add better integration with Java 8 features. In fact, better support to Java 8 is planned for Scala 2.12 (see the roadmap here and also this presentation from Adrian Moors).

但无论如何,还有scala-java8-compat, "a Java 8 compatibility kit for Scala" and there is also experimental support in Scala 2.11

查看您的代码,有一个相关问题:改为 Files.newDirectoryStream returns a DirectoryStream which is not a sub interface of java.util.stream.Stream, but an 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 version 0.8.0-RC3 or newer to your project (you may need to 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]