是否可以用 Stream API 替換下面代碼中的嵌套回圈?
Map<String, List<Role>> roleByUserUsername = roles.stream()
.collect(Collectors.groupingBy(//some foo that return userName
Role::getRoleId,
Collectors.toList()));
List<User> users = List.of(new User(), new User());
HashMap<String, User> userByRoleId = new HashMap<>();
for (final User user : users) {
for (final Role roles1 : roleByUserUsername.get(user.getPassword())) {
userByRoleId.put(roles1.getRoleId(), user);
}
}
uj5u.com熱心網友回復:
您需要展平從地圖獲得的角色串列roleByUsername。
順便說一句,有一個不一致的地方:根據它的名稱,映射意味著包含用戶名作為keys,但在回圈中,您通過提供 call 回傳的結果來訪問它getPassword()。
然后,您需要collect作為終端操作申請并提供收集器toMap()作為引數,以生成roleId與單個用戶關聯的地圖。
List<Role> roles = // initialing the list of roles
Map<String, List<Role>> roleByUsername = roles.stream()
.collect(Collectors.groupingBy(Role::getRoleId));
List<User> users = List.of(new User(), new User());
Map<String, User> userByRoleId = users.stream()
.flatMap(user -> roleByUsername.get(user.getPassword()).stream()
.map(role -> Map.entry(role.getRoleId(), user)))
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue
));
但這里有一個邏輯問題。假設roleId每個角色都是唯一的,但可能有多個用戶具有相同的角色。除非您設計了一個應用程式,其中每個用戶都有一個獨特的角色。
因此,將映射型別更改為Map<String, List<User>>以便將用戶集合映射到每個roleId.
為了實作這一點,我們需要將收集器從 更改為toMap與groupingBy()和 結合mapping()使用toList()。
Map<String, List<User>> userByRoleId = users.stream()
.flatMap(user -> roleByUsername.get(user.getPassword()).stream()
.map(role -> Map.entry(role.getRoleId(), user)))
.collect(Collectors.groupingBy(
Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue,
Collectors.toList())
));
旁注:
收集器
groupingBy()有一種只需要一個引數 -classifier函式的風格。默認情況下,它將映射到同一鍵的所有元素存盤到串列中。您不需要toList()作為下游提供。針對類似的介面撰寫代碼
Map,不要讓它依賴于具體的實作:“編程到介面”是什么意思?
uj5u.com熱心網友回復:
嘗試這個
users.stream().forEach(user->roleByUserUsername.get(user.getPassword()).forEach(role->userByRoleId.put(role.getRoleId(), user)));
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/486721.html
