【问题标题】:How to regroup a list of custom objects into a map in Java?如何将自定义对象列表重新组合成 Java 中的地图?
【发布时间】:2021-09-19 01:05:28
【问题描述】:

我有以下对象列表

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,key 应该是 customerID,values 应该是 Account 列表

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)

如何做到这一点?

【问题讨论】:

    标签: java java-8 java-stream grouping


    【解决方案1】:

    您可以使用Collectors.groupingBy

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

    Demo

    【讨论】:

      【解决方案2】:
      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);
      }
      

      【讨论】:

        【解决方案3】:

        为了清楚起见,我更喜欢使用带有三个参数的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())));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-15
          • 1970-01-01
          • 2018-02-09
          • 2022-10-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多