2015-08-20 11 views
5

Zakładając, mam następującą listę map,Jak znaleźć minimalny wynik każdego użytkownika z listy map wykorzystujących Java 8 strumień

List<Map<String, Integer>> scores = new ArrayList<>(); 

scores.add(Collections.singletonMap("user1", 3)); 
scores.add(Collections.singletonMap("user3", 15)); 
scores.add(Collections.singletonMap("user1", 1)); 
scores.add(Collections.singletonMap("user2", 5)); 
scores.add(Collections.singletonMap("user2", 23)); 
scores.add(Collections.singletonMap("user1", 10)); 

chciałbym wyodrębnić minumum wynik każdego użytkownika w mapuj za pomocą strumienia Java 8 z wyrażeniami lambda. Pożądany wynik byłby

{user1=1, user2=5, user3=15} 

Próbowałem to i to nie działa,

Map<String, Integer> result = scores.stream() 
    .flatMap(m -> m.entrySet().stream()) 
    .collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.minBy(Comparator.comparingInt(Map.Entry::getValue)))); 

Czy ktoś może mi powiedzieć jak to zrobić?

Z góry dziękuję.

Odpowiedz

6
Map<String, Integer> result = 
    scores.stream() 
      .flatMap(map -> map.entrySet().stream()) 
      .collect(Collectors.toMap(Map.Entry::getKey, 
            Map.Entry::getValue, 
            Math::min)); 
5

Kolektor dolotowy z powrotem pobiera Optional<Entry<String, Integer>>, ale potrzebujesz po prostu Integer. Więc powinieneś użyć Collectors.collectingAndThen, aby dostosować dalszy kolektor. Rozważ także zastosowanie metody statycznej.

Map<String, Integer> result = scores 
     .stream() 
     .flatMap(m -> m.entrySet().stream()) 
     .collect(Collectors.groupingBy(Map.Entry::getKey, 
      Collectors.collectingAndThen(
       Collectors.minBy(Map.Entry.comparingByValue()), 
       opt -> opt.get().getValue()))); 
+0

Dzięki za wyjaśnienie. – user5245796

0

inny sposób, bez korzystania ze strumieni, ale z Java 8 cechy:

Map<String, Integer> result = new HashMap<>(); 
scores.forEach(map -> map.forEach((k, v) -> result.merge(k, v, Integer::min))); 

ten wykorzystuje metodę Map.merge aby wybrać wartość minimalną dla klucza już istniejącej.

Powiązane problemy