2016-01-22 145 views
0

我的代碼開始是這樣的:如何有效地與來自Scala的Java流進行交互?

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

Prerferably我想獲得「文件路徑」有型數組[路徑]。 (任何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將錯誤是: 「exptected:(路徑)=> GenTraversableOnce [NotInferedB],則實際:(路徑)=>任何」)

+0

最終https://github.com/scala/scala-java8-compat應有的東西,使這個更容易 –

回答

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