2011-09-23 16 views
13

Javaコードから呼び出す必要があるScala関数foo(bs : Stream[Bar]) : Batがあります。 Javaで "bs" Stream(Stream[Bar])を作成し、そのBarオブジェクトを遅延生成するにはどうすればよいですか?JavaでScalaストリームをインスタンス化して取り込む方法は?

+0

そのストリームが来るんhttp://functionaljava.googlecode.com/svn/artifacts/3.0/javadoc/fj/data/Stream.html?あなたはJava Collectionでそれを持っていますか、イベントを通してそれを取得しますか?それを知らずに、それについての最良の方法を主張することは不可能です。 –

+0

私の現実の問題では、私はJava Vectorを持っています。私は、イベントから生成されたものを何か/何故違うのかということを理解することに興味があります。 –

+0

あなたの問題のために@Travisの答えは行く方法です。イベントからの生成はより困難です。良い例はScalaのsys.processライブラリで、実行中のプロセスの 'OutputStream'から' Stream'を生成することができます。 –

答えて

8

ストリームにする必要が内容に応じて、それはjava.util.Iteratorを作成し、scala.collection.Iterator経由Streamにこれを変換する最も簡単かもしれません:

import scala.collection.JavaConverters; 
import scala.collection.immutable.Stream; 

... 

List<String> list = new ArrayList<String>(); 

\\ Fill the list somehow... 

Iterator<String> it = list.iterator(); 

Stream<String> stream = JavaConverters.asScalaIteratorConverter(it) 
             .asScala().toStream(); 

イテレータはコレクションから来る必要はありません。私たち自身のイテレータを実装することで、無限ストリームを簡単に作成することもできます:

Stream<String> stream = JavaConverters.asScalaIteratorConverter(
    new Iterator<String>() { 
    int i = 0; 
    public boolean hasNext() { return true; } 
    public void remove() { throw new UnsupportedOperationException(); } 
    public String next() { return Integer.toString(i++); } 
    } 
).asScala().toStream(); 

これはStream.iterate(0)(_ + 1).map(_.toString)のようなものではありませんが、機能します。

+0

非常に使いやすい。どうも! –

0

あなたは

scala.collection.immutable.Stream bs = new scala.collection.immutable.Stream() 

を試してみましたか?

+0

私はJavaベースのストリーム生成(インスタンス化だけでなく)の完全な例を探していることを明らかにするために質問を編集しました –

10

Streamオブジェクトコンパニオンで利用できるファクトリの1つを使用するのが最善の方法です。それらの中で最も有用なものはFunction1を実装する必要があります。これはAbstractFunction1を拡張することで可能です。ここで

は例です:

import scala.collection.immutable.Stream; 
import scala.runtime.AbstractFunction1; 

public class Ex { 
    public Stream<Integer> stream = Stream.iterate(0, new Increment()); 
} 

class Increment extends AbstractFunction1<Integer, Integer> { 
    public Integer apply(Integer v1) { 
     return v1 + 1; 
    } 
} 
+0

@Travisの回答は私の特定の問題に対する最も単純な答えであるため、この答えはより一般的な場合に非常に役立ちます。 –

0

は、私はあなたがScalaのストリームを探していた知っているが、機能的なJavaはあまりにもあります:

関連する問題