2017-08-01 15 views
6

Próbuję dostać się do programowania funkcyjnego na Java 8Java 8 strumień, uzyskać średnią wieku od kraju

klasa User

public class User { 
    private String name; 
    private Country country; 
    private int age; 
    // setters - getters 
} 

klasa Kraj

public class Country { 
    private String name; 
    private int population; 
    //setters - getters 
} 

Teraz chcę uzyskać średni wiek użytkowników według krajów, w zasadzie Map<String, Double>. Mogę to zrobić po prostu przez iterację listy użytkowników. Jednak chciałbym wdrożyć go w sposób functional, z stream. Wiem o collect i groupingBy.

Próbowałem users.stream().collect(Collectors.groupingBy(user -> user.getCountry())); i otrzymałem numer Map<String, List<User>>. Nie mogę wymyślić, jak wykonać część uśredniającą.

+3

rzucić okiem tutaj https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#groupingBy- java.util.function.Function-java.util.stream.Collector- – user902383

Odpowiedz

7

Dodać drugi parametr do groupingBy

Map<String, Double> map = users 
    .stream() 
    .collect(Collectors.groupingBy(
      user -> user.getCountry().getName(), 
      Collectors.averagingInt(User::getAge))); 
Powiązane problemy