2016-03-28 16 views
5

遅延評価に使用するkotlinで無限シーケンスを作成する方法について混乱します。 Javaでkotlin反復関数を使用した無限シーケンス

IntStream.iterate(0, i -> i + 2) 
    .limit(100) 
    .forEach(System.out::println); 

が、シーケンスは、Javaストリームその後、はるかに混乱を招くようです。それが言うために、シーケンスコンストラクタは非常にドキュメントを混乱さ:

/** 
* Given an [iterator] function constructs a [Sequence] that returns values through the [Iterator] 
* provided by that function. 
* The values are evaluated lazily, and the sequence is potentially infinite. 
*/ 

を私はそれはイテレータ機能によって、あるいはどのように1を作るために何を意味するのか分かりません。

Sequence { iterator(arrayOf<Int>()) } 
     .forEach { print(it) } 

これはコンパイルされていますが、明らかに何も印刷されません。私は反復子関数が意味をなさないとは思わない。それは、引数を取らず、イテレータを返す関数を必要とします。これは、Javaの.iterate関数とまったく同じではありません。イテレーターは配列をとるコンストラクターを持っていることがあります。これは、配列内で動作するようにデータセットを持っていれば意味がありますが、そうではありません。私は無限のシーケンスで作業したい。

.limitはありません。以前は.reduceを追加しようとしましたが、.reduceの引数はさらに混乱していました。私は.toリストがあるはずだと思うが、それが動作していないことを知っていたので、私はそれを試していなかった。

誰かがlotlinで上記のJavaコードを実装する方法を教えてくれれば、多くの助けになります。

答えて

15

あなたはgenerateSequenceファクトリメソッドを使用することができます。

generateSequence(0) { it + 2 }.take(100).forEach { println(it) } 
generateSequence(0) { it + 2 }.forEach { println(it) } 

または制限された場合の

関連する問題