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)
| 归档时间: |
|
| 查看次数: |
2910 次 |
| 最近记录: |