2016-03-21 17 views
0

Eşit miktarda öğeye sahip bir ArrayList<Integer> sahibiyim. Bir seferde 2 değeri ayrıştırmak için Stream.forEach'u nasıl kullanabilirim?Birden çok değerle akış foreach?

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

Bu çalışmaz.

+0

Hangi değerler? ... – Maroun

+0

Tamsayı değerleri, örneğin: 1, 2, 3, 4, 5, 6 – QuaziModo

+0

[Bir akıştan ardışık çiftleri topla] 'ya baktığınız (http://stackoverflow.com/questions/ 20470010/toplamak-ardışık-çift-den-a-akışı? RQ = 1)? –

cevap

0

Bu hile olacaktır:

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

Bu listeden şu çıktıyı üretecek [1, 2, 3, 4, 5, 6]:

1-2 
3-4 
5-6 
1

ekleyebilir olabilir projenizin bazı yarar sınıfına yardımcı yöntemi aşağıdaki gibidir:

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))); 
} 

Ve bu gibi kullanmak:

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

Eğer akımların kullanımı uğruna akışları kullanmak istiyorsanız şunları yapabilirsiniz:

  1. çiftleri toplamak için oldukça zor özel Collector yazma, daha sonra bu yeniden akışı ve işlemi gerçekleştirmek veya
  2. , öğelerden ziyade indeksler üzerinde yinelenir, burada verilen yanıtlar vardır (ancak ilgilendiğiniz nesnenin bir akışı olmaz).

Buradaki sorun, Akımların, (bazı istisnalar hariç) öğeleri bir araya getirmek için değil, yan etkilere sahip olmayan vatansız boru hattı operasyonları için tasarlanmasıdır. docs oldukça ayrıntılı. Burada bir iterator kullanma

çok daha uygun olacaktır:

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

Not: Liste tek boyutta ise bu NoSuchElementException atar. Gerekirse bir savunma kontrolü kolayca yazılabilir.

İlgili konular