2016-05-06 14 views
5

Próbuję wyodrębnić i zliczyć liczbę różnych elementów w wartościach mapy. Chodzi o to, że nie jest to tylko mapa, ale wiele z nich, które należy zdobyć z listy map.Strumień Java. Wyodrębnianie różnych wartości wielu map

W szczególności mam klasę Tournament z członkiem List<Event> event. Model event ma element Map<Localization, Set<Timeslot>> unavailableLocalizations. Chciałbym policzyć wyróżniki dla wszystkich tych wartości szczelin czasowych.

Do tej pory udało mi się policzyć distincts w jednym mapie tak:

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

Ale czego nie może dowiedzieć się, jak to zrobić, że dla wszystkich mapach zamiast na tylko jeden.

Sądzę, że potrzebowałbym jakiegoś sposobu, aby wziąć wartości mapy każdego wydarzenia i umieścić to wszystko w strumieniu, a reszta byłaby taka sama jak ja.

Odpowiedz

11

Zróbmy to krok po kroku:

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

Nie jestem pewien, czy chłód odniesienia metoda jest na tyle wysoki, aby uzasadnić za pomocą '.map (Event :: getUnavailableLocalizations) .map (Map :: wartości) .flatMap (Collection :: stream) 'zamiast' .flatMap (event -> event.getUnavailableLocalizations(). values ​​(). stream()) '. To drugie ułatwia rozpoznanie brakującego kroku od podejścia PO do ostatecznego rozwiązania. – Holger