2015-10-07 7 views
7

Ich habe den folgenden Code:Wie Doppelstrom sammeln zur Liste

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

Ich möchte List<Double> zurückzukehren.

Dieser Code wird nicht kompiliert.

Ich sehe Fehler:

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) 

Wie dieses Problem zu beheben?

+2

Warum Sie 'mapToDouble' wird man es in eine Liste direkt nach sammeln möchten? Verwenden Sie einfach "map". Sie wollen die Umwandlung 'String -> Double -> double -> Double' machen, während' String -> Double' ausreichend ist. –

+1

Was ist seltsam? Sie stellen eine Funktion 'String -> Double' zur Verfügung, wenn Sie sie in eine' List' sammeln wollen, muss es ein 'Double' sein. –

+0

Alexis C. Ist DoubleStream primitiver Stream? – gstackoverflow

Antwort

14

Sie könnten boxed() verwenden. Dies bildet einen DoubleStream (Strom primitiver Doubles, wie er von mapToDouble zurückgegeben wird) auf einen Stream<Double> ab.

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

Bitte beachte, dass es Double::valueOf-Double::parseDouble geändert: dies verhindert, dass die Double von Double.valueOf zurück in die primitiven double unboxed zu sein.

Aber warum verwenden Sie mapToDouble, um mit zu beginnen? Sie könnten nur map wie folgt verwenden:

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

... und für potentiell größere Streams würde ich 'Pattern.compile (", ") empfehlen. splitAsStream ("1,2,3,4, ...") 'da es kein Array zum Erstellen des Streams füllen muss. – Holger

+2

@Holger andererseits '.split (", ")' ist ein schneller Pfad, der überhaupt kein regexp-Objekt und 'Matcher' erzeugt. Es ist nicht sehr klar, bei welcher Anzahl von Tokens der 'splitAsStream' den' String.split' übertrifft ... –

+1

@Tagir Valeev: Das ist immer der Fall, dass Sie den Schwellenwert "große Zahl" nicht genau kennen. Aber es ist klar, dass Sie mit einer wachsenden Anzahl generierter Teilstrings den Overhead eines einzelnen Pattern/Matcher-Objekts ignorieren können. – Holger