2014-06-13 8 views
19

Wenn ich collect in einem sequentiellen Stream (zB vom Aufruf von Collection.stream()) anrufe, wird dann der Combiner-Parameter verwendet, den ich zum Sammeln durchlasse? Ich vermute nicht, aber ich sehe nichts in der Dokumentation. Wenn ich richtig liege, dann scheint es bedauerlich zu sein, etwas zu liefern, von dem ich weiß, dass es nicht verwendet wird (wenn ich weiß, dass es ein sequenzieller Stream ist).Verwendet ein sequenzieller Stream in Java 8 den combiner-Parameter beim Aufruf von collect?

+1

Was passiert, wenn Sie Null für den Kombinator übergeben? Was folgern Sie aus diesem Experiment? –

Antwort

18

Denken Sie daran, gegen Schnittstellenspezifikationen zu entwickeln - nicht gegen die Implementierung. Die Implementierung könnte sich mit der nächsten Java-Version ändern, während die Spezifikation stabil bleiben sollte.

Die Spezifikation unterscheidet nicht zwischen sequentiellen und parallelen Streams. Aus diesem Grund sollten Sie davon ausgehen, dass der Kombinierer verwendet werden kann. Tatsächlich gibt es gute Beispiele, die zeigen, dass Combiner für sequentielle Streams die Leistung verbessern können. Beispielsweise verkettet die folgende Operation eine Liste von Zeichenfolgen. Das Ausführen des Codes ohne Kombinierer hat quadratische Komplexität. Eine intelligente Ausführung mit Kombinator kann die Laufzeit um Größen reduzieren.

List<String> tokens = ...; 
String result = tokens.stream().reduce("", String::concat, String::concat); 
+4

Es wäre * sehr * schlau, wenn die 'Stream'-Implementierung erkennt, ob die Verwendung des Combiners die Leistung verbessern kann. Das größere Risiko besteht jedoch darin, dass der Entwickler selbst einen Stream parallel zu einem Zeitpunkt ändert, an dem er den ausgelassenen Combiner vergessen hat ... – Holger

+3

@Holger Richtig, oder ein anderer Entwickler übergibt einen Stream an Ihren Code, und dieser Stream könnte ändern, um in der Zukunft parallel zu sein. –

+2

Danke für Ihre Antwort. Ich hatte das gleiche Problem, und während ich mich immer an die Schnittstelle anpasse, finde ich es schade, dass es keine "einfache" Version eines Kollektors ohne Combiner gibt. Das würde die Dinge viel einfacher machen. Sie könnten eine 'Collector.Characteristics' gemacht haben, um dies anzuzeigen, oder eine einfachere Version der' Collector'-Schnittstelle ... – glglgl