2016-07-20 13 views
3

私はJavaライブラリをどのように使うことができるのか知っています。私が必要とするものを行うループを書くことができますが、質問はもっとあります。 scala.collection.JavaConvertersまたはscala.collection.JavaConverstionsを入力してjava.util.stream.Streamscala.collection.immutable.Streamに変換しますか?java.util.stream.StreamをScala 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) 
} 
+0

。どのストリーム(Java 8またはScala)?ここでの問題は何ですか?あなたはすでに何をしようとしましたか? – marcospereira

+0

Java8ストリームからScalaストリームへの変換。だから両方。私はそれがはっきりしていると思った。 – Arne

+0

そうではありません。質問を書き直してください。できれば、達成したいことに関連するコードを書いてください。 – marcospereira

答えて

8

JavaConvertersJavaConversionsの現在のバージョンをJavaストリームとスカラストリームは、ロードマップでの違いが原因です。

java.util.stream.Streamが導入されたJava 8は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もあります。

あなたのコードを見てみると、そこに関連する問題である:java.util.stream.StreamのサブインタフェースではありませんDirectoryStreamを返しFiles.newDirectoryStream、代わりにIterable。これはあなたが本当に欲しいものです、そして、あなたのコードは次のようであるべきであれば、あなたが必要なもの、ScalaのStreamIterableを変換する方法である:

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-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] 
+0

ありがとう、これは本当に素晴らしく詳細な答えでした。私はこれ以上これを期待していませんでした。 – Arne

関連する問題