2015-05-22 11 views
5

Vorrei sapere se esiste un modo più efficiente di sommare tutti gli elenchi di alberi, sommando i loro valori allo stesso indice.Elenchi sommatori API di Java Stream all'indice

Il motivo per cui lo chiedo perché, probabilmente utilizzando l'API di Streams, è possibile renderlo più generico, per un numero qualsiasi di elenchi.

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

grazie per qualsiasi intuizione.

+0

Cos'altro volete usarlo per - tutto 'Number's? – ChiefTwoPencils

+0

@ChiefTwoPencils Sì hai ragione mi mancava l'ovvio, l'ho modificato, la domanda è ancora valida per qualsiasi numero di elenchi, grazie – dotmindlabs

+0

@sodik intendo per qualsiasi numero di liste, se posso dire 100 liste, usando indice da un intervallo e ottenere i loro valori 100 volte sembra eccessivo. – dotmindlabs

risposta

5

ne dite di questo:

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

piccolo errore di battitura, dovrebbe essere 'lists.stream(). MapToInt (...)', :-) Inoltre non potresti renderlo più performante con un '.distinct(). Limit (2)', così che non appena trovi più di 2 dimensioni diverse, interrompi i calcoli? – user2336315

+0

Molto buono, semplice e pulito, ha senso, grazie! – dotmindlabs

+2

@ user2336315 Errore di battitura fisso. Il tuo suggerimento di "limite" è OK, ma francamente non mi preoccuperei; il "costo" extra si presenta solo prima che tu stia per gettare comunque un'eccezione. Piccole ottimizzazioni sui percorsi will-fail raramente valgono la complessità aggiuntiva. –