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

时间:2016-07-20 17:17:25

标签: scala collections scala-collections

我知道如何使用Java库,我可以编写一些循环来完成我需要的东西,但问题是更多,为什么scala.collection.JavaConvertersscala.collection.JavaConverstions中没有任何内容将java.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)
}

1 个答案:

答案 0 :(得分:9)

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

Java 8,引入java.util.stream.Stream的版本为released at Mar 2014,而Scala 2.11.0为officially released at Apr 2014。因此,没有时间更改Scala 2.11计划以增加与Java 8功能的更好集成。事实上,计划为Scala 2.12提供更好的Java 8支持(参见roadmap here以及此presentation 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]