我知道如何使用Java库,我可以编写一些循环来完成我需要的东西,但问题是更多,为什么scala.collection.JavaConverters
或scala.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)
}
答案 0 :(得分:9)
由于路线图的差异,当前版本的JavaConverters
和JavaConversions
不提供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]