2016-01-19 13 views
13

Ho un elenco di oggetti:Java 8 stream API: filtro su istanza, e gettato

List<SomeType> myList; 

voglio ottenere un elenco di sotto-tipi disponibili in questa lista:

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

Non so come raccogliere per ottenere il tipo di elenco corretto.

+1

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

+0

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

risposta

48

È necessario lanciare gli oggetti:

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

Raccomando uno stile coerente. O '.filter (e -> e instanceof SomeChildType) .map (e -> (SomeChildType) e)' o '.filter (SomeChildType.class :: isInstance) .map (SomeChildType.class :: cast)' – Holger

+1

@Holger Non avevo pensato a 'Class :: isInstance' - grazie. – assylias

+0

'.map (SomeChildType.class :: cast)' non funziona per me. Qualsiasi altra funzione di flusso come '.filter()' mi chiede di lanciare nuovamente l'oggetto e se il compilatore non mi dice che il simbolo non può essere trovato – xetra11