2015-10-07 10 views
7

Ho il seguente codice:Come raccogliere DoubleStream to List

Stream.of("1,2,3,4".split(",")).mapToDouble(Double::valueOf).collect(Collectors.toList()); 

voglio tornare List<Double>.

Questo codice non viene compilato.

vedo errore:

Error:(57, 69) java: method collect in interface java.util.stream.DoubleStream cannot be applied to given types; 
    required: java.util.function.Supplier<R>,java.util.function.ObjDoubleConsumer<R>,java.util.function.BiConsumer<R,R> 
    found: java.util.stream.Collector<java.lang.Object,capture#1 of ?,java.util.List<java.lang.Object>> 
    reason: cannot infer type-variable(s) R 
    (actual and formal argument lists differ in length) 

Come risolvere questo problema?

+2

Perché si utilizza 'mapToDouble' è si vuole raccogliere in una lista subito dopo? Basta usare 'map'. Si desidera eseguire la conversione 'String -> Double -> double -> Double' mentre' String -> Double' è sufficiente. –

+1

Che cosa è strano? Stai fornendo una funzione 'String -> Double', se vuoi raccoglierla in un' List', deve essere un 'Double'. –

+0

Alexis C. Il flusso primitivo DoubleStream? – gstackoverflow

risposta

14

È possibile utilizzare boxed(). Questo mappa un DoubleStream (flusso di doppi primitivi, come restituito da mapToDouble) a un Stream<Double>.

Stream.of("1,2,3,4".split(",")).mapToDouble(Double::parseDouble).boxed().collect(Collectors.toList()); 

Nota che ho cambiato Double::valueOf-Double::parseDouble: questo impedisce il Double restituito da Double.valueOf di essere unboxed al primitivo double.

Ma perché stai usando mapToDouble per cominciare? Si potrebbe utilizzare map come questo:

Stream.of("1,2,3,4".split(",")).map(Double::valueOf).collect(Collectors.toList()); 
+4

... e per flussi potenzialmente più grandi, mi raccomando 'Pattern.compile (", "). splitAsStream ("1,2,3,4, ...") 'in quanto non è necessario popolare una matrice per creare il flusso. – Holger

+2

@Holger, d'altra parte '.split (", ")' è un percorso veloce che non crea affatto un oggetto regexp e 'Matcher'. Non è molto chiaro a quale numero di token il 'splitAsStream' supererà il' String.split' ... –

+1

@Tagir Valeev: è sempre il caso che non si conosca esattamente la soglia del "numero grande". Ma è chiaro che con un numero crescente di sottostringhe generate è possibile ignorare il sovraccarico di un singolo oggetto pattern/matcher. – Holger