7

I'm trying to get into functional programming on java 8

User class

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

Country class

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

Now I want to get the average age of Users by Country, basically a Map<String, Double>. I can do it the old way just by iterating the users list. However I would like to implement it in a functional way , with stream. I know about collect and groupingBy.

I tried users.stream().collect(Collectors.groupingBy(user -> user.getCountry())); and get a Map<String, List<User>>. Can't figure out how to do the averaging part.

  • 3
    have a look here https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#groupingBy-java.util.function.Function-java.util.stream.Collector- – user902383 Aug 01 '17 at 14:31

1 Answers1

9

Add a second parameter to groupingBy

Map<String, Double> map = users
    .stream()
    .collect(Collectors.groupingBy(
           user -> user.getCountry().getName(),
           Collectors.averagingInt(User::getAge)));
Eugene
  • 117,005
  • 15
  • 201
  • 306