2016-03-21 10 views
0

私はArrayList<Integer>の要素が均等にあります。一度に2つの値を解析するためにStream.forEachを使用するにはどうすればよいですか?複数値のストリームforeach?

x.forEach((a, b) -> System.out.println(a.toString() + "-" + b.toString()); 

これは機能しません。

+0

値... – Maroun

+0

1,2,3,4,5,6などの整数値 – QuaziModo

+0

[ストリームから連続するペアを収集する]を見ましたか?(http://stackoverflow.com/questions/) 20470010/collect-continuous-pairs-a-stream?rq = 1)? –

答えて

0

これは、トリックを行います:

IntStream.range(0, list.size() - 1) 
.filter(i -> i % 2 == 0) 
.forEach(i -> System.out.println(list.get(i) + "-" + list.get(i + 1))); 

それはリスト[1、2、3、4、5、6]から次の出力が生成されます:あなたが追加することが

1-2 
3-4 
5-6 
1

あなたのプロジェクトのいくつかのユーティリティクラスに次のヘルパーメソッド:

public static <T> void forPairs(List<T> list, BiConsumer<T, T> action) { 
    IntStream.range(0, list.size()/2) 
      .forEach(i -> action.accept(list.get(i*2), list.get(i*2+1))); 
} 

そして、このようにそれを使用します。

List<Integer> list = Arrays.asList(1, 3, 5, 2, 1, 6); 
forPairs(list, (a, b) -> System.out.println(a + "-" + b)); 
0

あなたはストリームを使用するためのストリームを使用したい場合は、次のことができます。

  1. がペアを収集するために非常に困難カスタムコレクタを作成し、それらを再ストリーミングし、あなたの操作を実行し、または
  2. 要素ではなくインデックスを反復すると、ここに回答があります(しかし、興味のあるオブジェクトのストリームではありません)。

ここで問題となるのは、ストリームは副作用のないステートレスなパイプライン操作用に設計されており、要素を組み合わせるためではありません(いくつかの例外を除いて)。 docsは非常に精巧です。

ここiteratorを使用すると、はるかに適切である:

Iterator<Integer> iterator = Arrays.asList(1, 2, 3, 4, 5, 6).iterator(); 
while(iterator.hasNext()) { 
    System.out.println(iterator.next().toString() + "-" + iterator.next().toString()); 
} 

注:リストが奇数サイズであるならば、これはNoSuchElementExceptionをスローします。必要に応じて防御チェックが簡単に書かれます。