2017-08-01 1 views
6

Ich versuche, in der funktionalen Programmierung auf Java zu bekommen 8Java 8 Strom, erhalten Durchschnittsalter von Land

Benutzerklasse

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

Land Klasse

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

Jetzt möchte ich das Durchschnittsalter der Benutzer nach Land, im Grunde eine Map<String, Double>. Ich kann es auf die alte Art und Weise tun, indem ich einfach die Benutzerliste wiederhole. Allerdings würde ich es gerne in eine functional Weise implementieren, mit stream. Ich weiß über collect und groupingBy.

Ich versuchte users.stream().collect(Collectors.groupingBy(user -> user.getCountry())); und erhalten Sie eine Map<String, List<User>>. Ich kann nicht herausfinden, wie man den Mittelungsteil macht.

+3

einen Blick hier haben https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#groupingBy- java.util.function.Function-java.util.stream.Collector- – user902383

Antwort

7

einen zweiten Parameter In den groupingBy

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