2016-01-19 8 views
13

ich eine Liste von Objekten:Java 8 Stream-API: Filter auf Instanz und warf

List<SomeType> myList; 

Ich möchte eine Liste mit Untertypen bekommen in dieser Liste:

List<SomeChildType> myChildList = myList.stream().filter(e -> e instanceof SomeChildType).collect(??????) 

Ich kann nicht sammeln, um den richtigen Listentyp zu erhalten.

+1

Verwandte: http://stackoverflow.com/q/27559231/2711488 – Holger

+0

Verwandte: https://stackoverflow.com/questions/44242103/how-to -reuse-application-of-filter-map-on-a-stream –

Antwort

48

Sie müssen die Objekte werfen:

List<SomeChildType> myChildList = myList.stream() 
             .filter(SomeChildType.class::isInstance) 
             .map(SomeChildType.class::cast) 
             .collect(toList()) 
+7

Ich empfehle einen einheitlichen Stil. Entweder '.filter (e -> e instanceof SomeChildType) .map (e -> (SomeChildType) e)' oder '.filter (SomeChildType.class :: isInstance) .map (SomeChildType.class :: cast)' – Holger

+1

@Holger Ich hatte nicht an Class :: isInstance gedacht - danke. – assylias

+0

'.map (SomeChildType.class :: cast)' funktioniert nicht für mich. Jede weitere Stream-Funktion wie '.filter()' will, dass ich das Element erneut umwandle und wenn nicht, sagt mir der Compiler, dass das Symbol nicht gefunden werden konnte. – xetra11