2017-10-16 10 views
4

Boolean.FALSEのストリーム、たとえば100の長さを作成するにはどうすればよいですか?ブールのストリームを生成する

私は何をして苦労してきたことである:

  1. は、もともと私はBoolean.FALSEの配列を作成することを目的としました。しかしnew Boolean[100]NULLの配列を返します。私はストリームAPIを便利なIterableとほとんど(1Iterable操作ツールとして使用することを合理的に考えました。
  2. Booleanは、それがSupplier<T>3)を受け入れるため、それゆえ私は は、Stream.generate()を使用することはできません、無のparamsコンストラクタ(2)はありません。

私が見つけたのはStream.iterate(Boolean.FALSE, bool -> Boolean.FALSE).limit(100);ですが、私が望むものを与えてくれますが、それはかなり上品な解決策ではありません。

もう1つのオプション、私は(4)がIntStream.range(0, 100).mapToObj(idx -> Boolean.FALSE);であることを発見しました。これはさらに奇妙に思えます。

これらのオプションはストリームAPIのパイプライン構想に違反しませんが、Boolean.FALSEのストリームを作成するための簡潔な方法はありますか?それは関係なく、必要な大きさの、Stream.generate().limit()ソリューションに比べてより多くのストレージを必要としないので、nCopiesによって返さListtiny (it contains a single reference to the data object).であることを

Collections.nCopies (100, Boolean.FALSE).stream()... 

注:

+4

なぜあなたは 'Stream.generate()'を使用できないと思いますか?これを試してみましょう: 'Stream.generate(Boolean).Flse).limit(100)' – Jesper

+2

私はそのようなストリームに妥当なユースケースを想像することはできません。ステートレス関数のみを使用する(つまり処理順序に依存しない)推奨される方法に従うと、結果は常に100個の同一要素のストリームまたは空のストリームになります。最終結果がどんなものであろうと、代わりに単一の要素ストリームから生成することは常に可能です。 – Holger

+0

@Holger無向グラフのサイクルを検出します。ステップの1つは、平行エッジの検出です。私は、並列性を検出するために私が訪れたすべての頂点に印をつけます。したがって、各頂点は「訪問されました」という配列に一致します。反復が完了した後、「訪問されました」の配列をリセットする必要があります。そして、私はそのようなストリームを再生させます。私はこの目的のために0と1の配列を使うことができましたが、わかりやすくするために私が使ったものを使うことに決めました。 –

答えて

8

Booleanは何の引数なしのコンストラクタを持っていない場合でも、あなたはまだラムダを使用してStream.generateを使用することができます。

Stream.generate(() -> Boolean.FALSE).limit(100) 

これはまた、それらが同じになること(コンストラクタを使用する場合と比較して)という利点がありBooleanのインスタンスであり、100の異なるものではありません。

+0

OMG!確かに!私はメソッド参照について考えているlambdasについて完全に忘れていました... Thx –

7

あなたはCollectionsstatic <T> List<T> nCopies(int n, T o)を使用することができます。

関連する問題