将 java.util.stream.Stream 转换为 Scala 流
Convert java.util.stream.Stream to Scala Stream
我知道如何使用 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)
}
由于路线图的差异,JavaConverters
和 JavaConversions
的当前版本不提供 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]
我知道如何使用 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)
}
由于路线图的差异,JavaConverters
和 JavaConversions
的当前版本不提供 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]