2017-02-09 4 views
8

die folgenden als Beispiel für Datenklassen Gegeben:Warum kann Stream.flatMap keine Sammlung akzeptieren?

class Country { 

    List<Region> regions = new ArrayList<>(); 

    List<Region> getRegions() { 
     return regions; 
    } 

} 

class Region { 

    String getName() { 
     return "some name"; 
    } 

} 

Vorausgesetzt ich eine Liste der Länder

List<Country> countries = new ArrayList<>(); 

Und wollte hätte ich die in ihren Regionen und ihren entsprechenden Namen Streamen Ich mag würde um folgende Aktionen: jedoch

countries.stream().flatMap(Country::getRegions).map(Region::getName)... 

dass Code nicht, da der Rückgabewert von „getRegions“ eine Sammlung ist nicht kompiliert (Liste) im Gegensatz zu einem Stream, der von der flatMap-Methode akzeptiert wird. Aber da ich weiß, dass jede Sammlung über seine Collection.stream() Methode gestreamt werden kann, sollte das kein Problem sein. Noch bin ich gezwungen, es wie folgt zu schreiben:

Welches ist (in einem reicheren Kontext) weit weniger lesbar als das erstere.

Fragen sind, gibt es irgendeinen Grund, den ich verpasse, um so sperrig zu sein? Ich habe viele Beispiele in unserem Rahmen, in denen ich gezwungen bin, diesen Weg einzuschlagen, wobei ich immer einen sauren Geschmack hinterlasse. (Ich denke, ich muss nur Kotlin zu unseren Projekten hinzufügen und erweitern Sie die Stream-Klasse mit einer FlatMap-Methode, die eine Sammlung nimmt: p oder mache ich?)

+0

Ich versuchte auch Folgendes, da es Sinn machte in meinem Kopf, offensichtlich kompilierte es nicht: Land :: getRegions :: stream – Lukas

+2

Ich stimme zu, dass 'flatMap' sollte eine Sammlung akzeptieren, aber ich bin mir nicht sicher, ob SO ist in der Lage sein wird, eine definitive Erklärung abzugeben, außer dass "die Leute, die es geschrieben haben, es nicht so geschrieben haben". – khelwood

+0

"Nein" könnte auch eine Antwort sein :) – Lukas

Antwort

14

Ein technischer Grund, der nicht ideal ist, könnte aber warum dies warn Fertig. Sie können einen generischen Typ in Java nicht überladen.

Sie brauchen

Stream.flatMap(Function<Object, Stream<X>> function) 

zu unterstützen, die bedeutet, dass sie es nicht mit

überlasten
Stream.flatMap(Function<Object, Collection<X>> function) 

wie diese beiden Methoden die gleiche Signatur nach dem Löschen haben.

Sie könnten eine Methode hinzufügen

Stream.flatMapCollection(Function<Object, Collection<X>> function) 

oder

Stream.flatMapIterable(Function<Object, Iterable<X>> function) 

Stream.flatMapI(Function<Object, Iterable<X>> function) 

aber es wäre nicht schön sein.

+0

Ja, wenn diese Methoden waren hinzugefügt, es wäre eine Verbesserung. – khelwood

+2

@khelwood es könnte nicht kürzer sein. Idealerweise würden sie Unterstützung für verdünnte Typen und eine Überladung von Generika hinzufügen. –

+1

Diese Antwort ist wirklich befriedigend.Oder vielmehr liefert es eine gültige Erklärung. Danke, – Lukas

Verwandte Themen