如何在java中将自定义对象列表重新组合到Map中?

9q78igpj  于 2021-08-20  发布在  Java
关注(0)|答案(3)|浏览(455)

我有以下对象列表

class Account {
    int id;
    String type;
    int balance;
    Customer customer;

    // getters setters
}

class Customer {
    int customerID;
}
List<Account> accounts = new ArrayList<>();
accounts.add(new Account(1, "abc", 17998210, new Customer(190)));
accounts.add(new Account(2, "hsj", 6786179, new Customer(190)));
accounts.add(new Account(4, "ioip", 246179, new Customer(191)));
accounts.add(new Account(4, "ewrew", 90179, new Customer(191)));

我想将上面的内容转移到map,键应该是customerid,值应该是帐户列表

Map<Integer, List<Account>>

Key            Value
190 -> Account(1, "abc", 17998210, 190)
       Account(2, "hsj", 6786179, 190)
191 -> Account(4, "ioip", 246179, 191)
       Account(4, "ewrew", 90179, 191)

如何做到这一点?

1tuwyuhd

1tuwyuhd1#

你可以用 Collectors.groupingBy .

Map<Integer, List<Account>> map =
    accounts.stream().collect(Collectors.groupingBy(Account::getCustomerID));

演示

tcbh2hod

tcbh2hod2#

List<Account> accounts = new ArrayList<>();
accounts.add(new Account(1, "abc", 17998210, 190));
accounts.add(new Account(2, "hsj", 6786179, 190));
accounts.add(new Account(4, "ioip", 246179, 191));
accounts.add(new Account(4, "ewrew", 90179, 191));

Map<Integer, List<Account>> accountsMap = new HashMap<>();

for (Account account : accounts) {
    accountsMap.computeIfAbsent(account.customerID, k -> new ArrayList<>()).add(account);
}
bkkx9g8r

bkkx9g8r3#

我宁愿使用 Collectors.toMap 方法具有三个参数,以确保清晰:

Map<Integer, List<Account>> map = accounts.stream()
        .collect(Collectors.toMap(
                // key - customerID
                e -> e.getCustomer().getCustomerID(),
                // value - List<Account>
                e -> List.of(e),
                // merge two lists
                (l1, l2) -> Stream.of(l1, l2)
                        .flatMap(List::stream)
                        .collect(Collectors.toList())));

相关问题