2016-03-25 3 views
17

Ich kann nur scheinen, wie man das in C# nicht Java tut.Wie man einen Java 8 Lambda-Ausdruck verwendet, um eine Liste eines Typs in eine Liste seines Subtyps zu konvertieren

Ich habe eine List<TypeX>, aber ich weiß, dass jedes einzelne Element in dieser Liste tatsächlich eine Unterklasse von TypeX mit der Bezeichnung TypeY ist. Wie kann ich einen Lambda-Ausdruck schreiben, der List<TypeX> akzeptiert, und List<TypeY> zurückgibt?

+0

hast du irgendwas probiert? – Reimeus

+0

Wenn ich ehrlich bin nein, ich nehme immer noch die Java-Lambda-Syntax. –

+0

Versuchen Sie, die gleiche Instanz auf eine andere Weise (unsicher) anzuzeigen oder eine neue Liste zu erstellen, wie in den 3 Antworten (bisher)? –

Antwort

22

Für mein Beispiel werde ich die folgenden Klassen verwenden:

class TypeX {} 
class TypeY extends TypeX {} 

Dann habe ich ein List<TypeX>:

final List<TypeX> xList = ... 

Alles, was Sie tun müssen, ist das eine Methode Bezug auf TypeY.class.cast verwenden:

final List<TypeY> yList = xList.stream() 
           .map(TypeY.class::cast) 
           .collect(toList()); 

Sie können auch filter() zu ausschließen Elemente, die einen Fehler verursachen wird:

final List<TypeY> yList = xList.stream() 
           .filter(TypeY.class::isInstance) 
           .map(TypeY.class::cast) 
           .collect(toList()); 

Beispiele verwenden:

import static java.util.stream.Collectors.toList; 
+5

Ich akzeptiere dies als die richtige Antwort wegen des Filters, um Fehler auszuschließen, aber ich würde vorschlagen, entweder den statischen Import für Collectors zu erwähnen oder die Antwort auf Collectors.toList() zu ändern. –

+0

Danke für diese Antwort! – dahui

4

einfach alle map mit einem Lambda, das die Elemente wirft:

List<TypeX> list = ...; 
List<TypeY> castList = 
    list.stream().map(x -> (TypeY)x).collect(Collectors.toList()); 
5

in Java Projizieren ist getan mit der map Methode:

List<TypeY> res = listTypeX 
    .stream() 
    .map((x) -> (TypeY)x) 
    .collect(Collectors.toList()); 
2

Sie können selectInstancesOf() von Eclipse Collections verwenden:

MutableList<TypeX> xList = Lists.mutable.empty(); 
MutableList<TypeY> yList = xList.selectInstancesOf(TypeY.class); 

Wenn Sie nicht xList von List ändern können:

List<TypeX> xList = Lists.mutable.empty(); 
List<TypeY> yList = ListAdapter.adapt(xList).selectInstancesOf(TypeY.class); 

Hinweis: Ich bin ein Beitrag Kollektionen Eclipse.

Verwandte Themen