如何与Scala的Java流有效交互?

时间:2016-01-22 14:59:01

标签: java scala

我的代码是这样开始的:

val paths: Array[Path] = ...
val filePaths: Array[java.util.stream.Stream[Path]] = paths.map(Files.walk(_))

我希望获得' filePaths'有类型Array [Path]。 (任何Scala集合都可以正常工作)。但是从这一点来看,任何进一步的进展都没有到达我。我尝试过各种JavaConversions,flatMap,reduce,collect和java.util.stream.Stream#toArray的组合,总是会导致一些模糊的类型错误。

此外,不仅要看到一个解决方案,还要了解为什么这看起来比它应该更加困难。例如,为什么没有

import scala.collection.JavaConversions._
...
paths.flatMap(Files.walk(_))
//or
paths.flatMap(Files.walk(_).collect(Collectors.toList))

工作? (IDE错误为:"已检测到:(路径)=> GenTraversableOnce [NotInferedB],实际:(路径)=>任何")

1 个答案:

答案 0 :(得分:1)

import scala.collection.JavaConverters._
paths.flatMap(Files.walk(_).collect(Collectors.toList[Path]).asScala)

你走在正确的道路上,toList只需要一个类型。

请注意,您应该更喜欢JavaConvertersJavaConversions,因为它更易读。

如果您使用-Xexperimental,您也可以使用java api

Arrays.stream(paths).flatMap(Files.walk(_)).collect(Collectors.toList[Path]).asScala