Как получить список идентификаторов при использовании groupingBy в лямбда-выражении Java - PullRequest
0 голосов
/ 29 октября 2018

Допустим, у нас есть объект User:

public class User {
    private Integer id;
    private Integer age;
    private String name;
    private String family;

    public User() {}

    public User(Integer id, Integer age, String name, String family) {
        this.id = id;
        this.age = age;
        this.name = name;
        this.family = family;
    }

    // getters and setters emited for brevity
}

и я пишу лямбда-выражение, как показано ниже, чтобы получить среднее значение по возрасту объектов на основе группировки некоторых полей:

public static void main(String[] args) {
    List<User> allUsers = new ArrayList<>();

    allUsers.add(new User(1, 25, "Rasool", "Ghafari"));
    allUsers.add(new User(2, 27, "Ali", "Sohrabi"));
    allUsers.add(new User(3, 25, "Ali", "Azizkhani"));
    allUsers.add(new User(4, 25, "Rasool", "Asadi"));
    allUsers.add(new User(5, 27, "Ali", "Rasooli Sa'd Abad"));
    allUsers.add(new User(6, 26, "Rasool", "Ameri"));

    Map<List<Object>, Long> groupedResult = 
        allUsers.stream().collect(
            groupingBy(
                u -> Arrays.asList(u.getName()),
                averagingDouble(User::getAge)
            )
        );

    // result:
    // {[Rasool] = 25.33, [Ali] = 26.33}
}

Теперь я хочу добавить что-нибудь в эту лямбду, но не знаю, как это сделать. я хочу получить список id сгруппированных объектов в каждой группе, может быть что-то вроде этого:

// {[Rasool, [1, 4, 6]] = 25.33, [Ali, [2, 3, 5]] = 26.33}

1 Ответ

0 голосов
/ 29 октября 2018

достаточно небольшого изменения:

Map<List<Object>, List<User>> groupedResult =
        allUsers.stream().collect(
                groupingBy(
                        u -> Arrays.asList(u.getName(), u.getAge()),
                        Collectors.toList()
                )
        );
...