2015-09-14 16 views
8

Sto cercando il modo più elegante per creare DoubleStream (per l'utilizzo di somma, media, ecc.) Da un List<Double>. Al momento ho questo codice:Collection <Double> to DoubleStream

List<Double> doubles = getListOfDoubles(); 
double sum = doubles.stream() 
        .mapToDouble(d -> d) 
        .sum(); 

Forse qualcuno potrebbe suggerire un modo più breve?

+0

Voglio dire, abbiamo sovraccarico Arrays.toStream (...) che potrebbe tornare diverso Stream, quindi perché non c'è nulla di simile per le collezioni? – Anatrollik

+0

Dove c'è qualcosa di simile in "Array"? – RealSkeptic

+0

@RealSkeptic [Array javadoc] (https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html) 'DoubleStream \t flusso statico (double [] array) Restituisce un sequenziale DoubleStream con l'array specificato come sorgente. Simile per IntStream, LongStream PS Scusa per la formattazione – Anatrollik

risposta

10

Il modo migliore per ottenere statistiche da un Stream consiste nell'utilizzare le classi ...SummaryStatistics. Per un Stream<Double>, questo è DoubleSummaryStatistics:

List<Double> doubles = getListOfDoubles(); 
DoubleSummaryStatistics stats = doubles.stream().collect(Collectors.summarizingDouble(Double::doubleValue)); 
System.out.println(stats.getAverage()); 
System.out.println(stats.getSum()); 

Si ottiene raccogliendo il flusso con la summarizingDouble collettore. Questo raccoglitore prende come argomento ToDoubleFunction: è una funzione che deve restituire l'analisi double.

Tali statistiche possono essere ottenute per i valori Integer, Long e Double.

Si noti che il caso generale di conversione di un Collection<Double> ad un DoubleStream può essere fatto con il codice hai già:

List<Double> doubles = getListOfDoubles(); 
DoubleStream stream = doubles.stream().mapToDouble(Double::doubleValue); 
1

Si può fare (anche se non è significativamente più breve, ma ...):

double sum = doubles.stream().collect(Collectors.summingDouble(x -> x)); 

o

double sum = DoubleStream.of(doubles.stream().mapToDouble(x->x).toArray()).sum(); 

ma quest'ultimo è più o meno lo stesso del vostro approccio.

+2

Non proprio. Memorizzare l'intero flusso in un array intermedio è uno spreco di risorse senza alcun vantaggio rispetto a tutte le altre soluzioni mostrate qui. – Holger