2016-05-06 12 views
5

Sto cercando di estrarre e contare il numero di diversi elementi nei valori di una mappa. Il fatto è che non è solo una mappa, ma molti di loro e devono essere ottenuti da un elenco di mappe.Java Stream. Estrazione di valori distinti di più mappe

In particolare, ho una classe Tournament con un membro List<Event> event. Un event ha un membro Map<Localization, Set<Timeslot>> unavailableLocalizations. Vorrei contare le differenze per tutti quei valori di timeslot.

Finora sono riuscito a contare i distinti in un solo mappa come questa:

event.getUnavailableLocalizations().values().stream().distinct().count() 

Ma quello che non riesco a capire è come fare per tutte le mappe invece che per uno solo.

Suppongo che avrei bisogno di un modo per prendere i valori di ogni evento della mappa e mettere tutto questo nello stream, quindi il resto sarebbe proprio come ho fatto io.

risposta

11

Facciamolo passo per passo:

listOfEvents.stream() //stream the events 
      .map(Event::getUnavailableLocalizations) //for each event, get the map 
      .map(Map::values) //get the values 
      .flatMap(Collection::stream) //flatMap to merge all the values into one stream 
      .distinct() //remove duplicates 
      .count(); //count 
+1

io non sono sicuro se la freschezza di metodo di riferimento è abbastanza alto per giustificare l'uso '.map (evento :: getUnavailableLocalizations) MAP (Mappa :: valori) .flatMap (Collection :: stream) 'invece di' .flatMap (event -> event.getUnavailableLocalizations(). values ​​(). stream()) '. Quest'ultimo rende più facile riconoscere il passaggio mancante dall'approccio dell'OP alla soluzione finale. – Holger