gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:50:50 27 4
gpt4 key购买 nike

我知道如何使用 Java 库,并且我可以编写一些循环来执行我需要的操作,但问题更多,为什么 scala.collection.JavaConverters 中没有任何内容或scala.collection.JavaConverstions转换 java.util.stream.Streamscala.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 之间的转换。

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 的子接口(interface),而是 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]

关于scala - 将 java.util.stream.Stream 转换为 Scala Stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38486886/

27 4 0