Группировка элементов

Основная задача найти сумму баланса для каждого пользователя. Нужно использовать вспомогательный класс для группировки Pair.

Мой код:

public class SummingMethod {

    public static class User {

        private String name;

        private List<Bill> bills = new ArrayList<>();

        public User(String name, List<Bill> bills) {
            this.name = name;
            this.bills = bills;
        }

        public String getName() {
            return name;
        }

        public List<Bill> getBills() {
            return bills;
        }
    }

    public static class Bill {

        private int balance;

        public Bill(int balance) {
            this.balance = balance;
        }

        public int getBalance() {
            return balance;
        }
    }

    private static class Pair {
        private User user;
        private Bill bill;

        public Pair(User user, Bill bill) {
            this.user = user;
            this.bill = bill;
        }

        public User getUser() {
            return user;
        }

        public Bill getBill() {
            return bill;
        }
    }

    public static Map<String, Integer> summing(List<User> users) {
        List.of(1, 2, 3, 4, 5, 6).stream()
                .collect(Collectors.groupingBy(
                        n -> n %= 2,
                        Collectors.summingInt(n -> n )
                )).forEach((k, v) -> System.out.println(k + " " + v));

    }
}

мой тест:

public class SummingMethodTest {

    @Test
    public void test() {
        Bill b1 = new Bill(1);
        Bill b2 = new Bill(2);
        Bill b3 = new Bill(3);
        Bill b4 = new Bill(4);
        Bill b5 = new Bill(5);
        Bill b6 = new Bill(6);
        User u1 = new User("u1", List.of(b1));
        User u2 = new User("u2", List.of(b2, b3));
        User u3 = new User("u3", List.of(b4, b5, b6));
        Map<String, Integer> expect = Map.of(
                "u1", 1,
                "u2", 5,
                "u3", 15
        );
        assertEquals(expect, SummingMethod.summing(List.of(u1, u2, u3)));
    }

}

что нужно сделать чтобы код работал как надо?


Ответы (1 шт):

Автор решения: Nowhere Man

Замечания по вопросу:

  • Представленный метод summing не будет компилироваться, так как он не возвращает мапу-результат.
  • Использование класса Pair не является необходимым для решения данной задачи даже для промежуточных вычислений суммарного баланса

Для решения данной задачи может оказаться проще воспользоваться коллектором Collectors.toMap вместо привычного Collectors.groupingBy

public static Map<String, Integer> summing(List<User> users) {
    return users.stream() // Stream<User>
        .collect(Collectors.toMap(
            User::getName,        // ключ: имя пользователя
            u -> u.getBills().stream().mapToInt(Bill::getBalance).sum(), // значение: суммарный баланс
            (s1, s2) -> s1 + s2,  // для решения возможных конфликтов
            LinkedHashMap::new    // для поддержания порядка вставки в мапу
        ));
}
→ Ссылка