2015-05-22 9 views
5

Chciałbym wiedzieć, czy istnieje skuteczniejszy sposób sumowania wszystkich list drzew - zsumowując ich wartości w tym samym indeksie.Listy podsumowujące API strumieni strumieniowych Java na indeksie

Powód, dla którego pytam o to, ponieważ prawdopodobnie korzystam z interfejsu API strumieniowego, aby uczynić go bardziej ogólnym dla dowolnej liczby list.

List<Double> listA = getListA(); 
List<Double> listB = getListB(); 
List<Double> listC = getListC(); 

int listsSize = listA.size(); 

    List<?> collect = IntStream.range(0, listsSize) 
      .mapToObj(i -> listA.get(i) + listB.get(i) + list(C).get(i)) 
      .collect(toList()); 

dzięki za wszelki wgląd.

+0

Co jeszcze chcesz użyć go do - wszystkich 'Number's? – ChiefTwoPencils

+0

@ChiefTwoPencils Tak, masz rację, po prostu spóźniłem się z oczywistością, edytowałem to, pytanie jest nadal ważne dla dowolnej liczby list, dziękuję – dotmindlabs

+0

@sodik mam na myśli dla dowolnej liczby list, jeśli mam powiedzieć 100 list, używając indeks z zakresu i otrzymanie ich wartości 100 razy wydaje się zbyt zatrważające. – dotmindlabs

Odpowiedz

5

Jak o tym:

List<List<Double>> lists = ...; 

// ensure all lists are same size, and get size 
int[] sizes = lists.stream().mapToInt(List::size).distinct().toArray(); 
if (sizes.length != 1) 
    throw ... 
int size = sizes[0]; 

double[] sums = 
    IntStream.range(0, size) 
      .mapToDouble(i -> lists.stream().mapToDouble(list -> list.get(i)).sum()) 
      .toArray(); 
+0

mała literówka, powinno to być 'lists.stream(). MapToInt (...)', :-) Czy nie mógłbyś uczynić tego bardziej wydajnym z '.distinct(). Limitem (2)', więc jak tylko znajdziesz więcej niż 2 różne rozmiary, zatrzymujesz obliczenia? – user2336315

+0

Bardzo dobrze, proste i czyste, ma sens, dzięki! – dotmindlabs

+2

@ user2336315 Naprawiono literówkę. Twoja sugestia "limitu" jest w porządku, ale szczerze mówiąc, nie zawracałbym sobie głowy; dodatkowy "koszt" pojawia się dopiero tuż przed wyrzuceniem wyjątku. Małe optymalizacje na ścieżkach fail-fail rzadko są warte dodatkowej złożoności. –

Powiązane problemy