2017-11-01 30 views
6

Java Stream.forEach関数には、コンシューマがチェック例外をスローすることは不可能であるという重大な制限があります。このように、ストリームの要素に1つずつアクセスしたいと思います。ストリームを1つずつ読み込む方法は?

は、私はこのような何かをしたい:

while(true) { 
    Optional<String> optNewString = myStream.findAny(); 

    if (optNewString.isPresent()) 
     doStuff(optNewString.get()); 
    else 
     break; 
} 

しかし、findAnyは短絡端末操作です。つまり、ストリームを閉じます。このコードは、whileループの2番目の反復でクラッシュします。私は単純に配列の中にすべての要素を配置することはできませんし、その配列を1つずつ移動することはできません。何千万もの要素が潜在的に存在するからです。

ご注意くださいforEach内から例外をスローする方法はありません。この質問はalready been answeredです。

+8

チェックされた例外は悪い考えであり、ストリームや関数型プログラミングにはうまく適合しません。だから、それらをキャッチし、実行時の例外でそれらをラップします。 –

+0

@JBNizet確かに、それはうまく動作し、私が現在 'LambdaException'型を使って行っていることです。ちょうどそれがうまくいっているということはそれがうまく書かれているということを意味するものではなく、常に改善の余地があります。さらに、ストリームの次の要素を待つことができないのは、APIの穴のようです。 –

+0

[This](https://stackoverflow.com/questions/20129762/why-does-streamt-not-implement-iterablet)を使用する可能性があります – jrtapsell

答えて

11

だけiterator()メソッドを呼び出し、ストリームの要素ごとを反復処理するには:それはチェック例外の面であなたを助けているどの程度に明確ではありません、それはそれはだということは注目に値します

Iterator<String> iterator = stream.iterator(); 
while (iterator.hasNext()) { 
    String element = iterator.next(); 
    // Use element 
} 

をイテレータを使用してしまえば、もう一度繰り返したい場合は新しいストリームを取得する必要がありますが、一度に1つの要素をストリームを読み込む方法の問題には答えています。

+0

チェックされた例外は質問の文脈でしかありませんでしたが、チェックされた例外はこのようにスローされる可能性がありますが、 'Stream.forEach'を使ってストリームを反復処理するときにはできません。 –

関連する問題