Ist es möglich, einen Stream in Java 8 zu übertragen? Angenommen, ich habe eine Liste von Objekten. Ich kann so etwas tun, um alle zusätzlichen Objekte herauszufiltern:
Stream.of(objects).filter(c -> c instanceof Client)
Wenn ich danach etwas mit den Kunden machen möchte, muss ich jeden von ihnen besetzen:
Stream.of(objects).filter(c -> c instanceof Client)
.map(c -> ((Client) c).getID()).forEach(System.out::println);
Das sieht ein bisschen hässlich aus. Ist es möglich, einen ganzen Stream in einen anderen Typ umzuwandeln? Wie Stream<Object>
zu einem gegossen Stream<Client>
?
Bitte ignorieren Sie die Tatsache, dass solche Dinge wahrscheinlich schlechtes Design bedeuten würden. Wir machen solche Sachen in meinem Informatikkurs, also habe ich mir die neuen Funktionen von Java 8 angesehen und war neugierig, ob dies möglich ist.
java
java-8
java-stream
Phiction
quelle
quelle
Antworten:
Ich glaube nicht, dass es einen Weg gibt, dies sofort zu tun. Eine möglicherweise sauberere Lösung wäre:
oder, wie in den Kommentaren vorgeschlagen, können Sie die
cast
Methode verwenden - die erstere ist jedoch möglicherweise leichter zu lesen:quelle
map
würdeStream<Client>
. Vielen Dank!Stream.of(objects).filter(Client.class::isInstance).[...]
In Anlehnung an Ggovans Antwort mache ich das wie folgt:
Verwenden dieser Hilfsfunktion:
quelle
Spät zur Party, aber ich denke, es ist eine nützliche Antwort.
flatMap
wäre der kürzeste Weg, es zu tun.Wenn dies der Fall
o
ist,Client
erstellen Sie einen Stream mit einem einzelnen Element. Andernfalls verwenden Sie den leeren Stream. Diese Ströme werden dann zu a abgeflachtStream<Client>
.quelle
if/else
eher einen als den?:
Operator verwenden würden, gäbe es keine Warnung. Seien Sie versichert, dass Sie die Warnung sicher unterdrücken können.Stream.of(objects).filter(o->o instanceof Client).map(o -> (Client)o)
oder sogarStream.of(objects).filter(Client.class::isInstance).map(Client.class::cast)
.Nein, das wäre nicht möglich. Dies ist in Java 8 nicht neu. Dies gilt speziell für Generika. A
List<Object>
ist kein super Typ vonList<String>
, also kann man nicht einfach aList<Object>
in a umwandelnList<String>
.Ähnlich ist das Problem hier. Sie können nicht werfen
Stream<Object>
zuStream<Client>
. Natürlich können Sie es indirekt so besetzen:Dies ist jedoch nicht sicher und kann zur Laufzeit fehlschlagen. Der Grund dafür ist, dass Generika in Java durch Löschen implementiert werden. Es sind also keine Typinformationen darüber verfügbar, welcher Typ
Stream
zur Laufzeit vorhanden ist. Alles ist gerechtStream
.Übrigens, was ist falsch an Ihrem Ansatz? Sieht gut aus für mich.
quelle
C#
wird mithilfe von Reification implementiert, während es in Java mithilfe von Erasure implementiert wird. Beide werden auf unterschiedliche Weise implementiert. Sie können also nicht erwarten, dass es in beiden Sprachen gleich funktioniert.