2016-03-14 16 views
7

Qual è l'equivalente Java 8 Stream di LINQ SelectMany?Equivalente Java Stream di LINQ SelectMany()

Ad esempio, in C#, se ho Dictionary<string, List<Tag>> tags che voglio trasformare in un IEnumerable<Tag> (un enumerabile piatta di tutti i tag nel dizionario), vorrei fare tags.SelectMany(kvp => kvp.Value).

Esiste un equivalente Java per uno Map<String, List<Tag>> che produce uno Stream<Tag>?

risposta

9

stai cercando di flatMap tutti i valori contenuti nella mappa:

Map<String, List<Tag>> map = new HashMap<>(); 
Stream<Tag> stream = map.values().stream().flatMap(List::stream); 

Questo codice prima recupera tutti i valori della mappa come Collection<List<Tag>> con values(), crea un flusso di questa collezione con stream() e quindi mappe piane ogni List<Tag> in un Stream con il metodo di riferimento List::stream.

+0

Quindi flatMap() non ha nulla a che fare con java.util.Map? Buono a sapersi, immagino ... –

+1

@RobertFraser Non devono essere confusi –

+2

@RobertFraser Il nome deriva dalla [funzione mappa] (https://en.wikipedia.org/wiki/Map_%28higher-order_function% 29) che "mappa una funzione" su (un elenco di) valori. – phg