創造を続け、成長を加速させましょう!「ナゲッツデイリーニュープラン・6月アップデートチャレンジ」に参加して4日目です。クリックしてイベントの詳細をご覧ください。
- UserInfoクラスがあります
JAVA8を介したストリーム操作は、userIdをキー、nameを値としてマップに変換する必要があります。
public class User {
private Integer userId;
private String name;
private String email;
public User(Integer userId, String name, String email) {
this.userId = userId;
this.name = name;
this.email = email;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"userId=" + userId +
", name='" + name + ''' +
", email='" + email + ''' +
'}';
}
}
复制代码
- 実装コード
public class ListToMap {
public static void main(String[] args) {
List<User> users = new ArrayList<>();
users.add(new User(1, "user1", "[email protected]"));
users.add(new User(2, "user2", "[email protected]"));
users.add(new User(3, "user3", "[email protected]"));
users.add(new User(4, "user4", "[email protected]"));
Map<Integer, String> userIdAndName = users.stream()
.collect(Collectors.toMap(User::getUserId, User::getName));
System.out.println(userIdAndName);
}
}
复制代码
出力結果
- userIdはキー、ユーザーオブジェクトは値です
public class ListToMap {
public static void main(String[] args) {
List<User> users = new ArrayList<>();
users.add(new User(1, "user1", "[email protected]"));
users.add(new User(2, "user2", "[email protected]"));
users.add(new User(3, "user3", "[email protected]"));
users.add(new User(4, "user4", "[email protected]"));
Map<Integer, User> userIdAndUser = users.stream()
.collect(Collectors.toMap(User::getUserId, user-> user));
System.out.println(userIdAndUser);
}
}
复制代码
出力
- 重複キー処理
変換プロセス中に同じキーが発生すると、重複キーの例外がスローされます。
userIdを3から2に変更しました。これは、2番目のユーザーと競合します。
Collectors.toMapは、重複する値を選択するための3番目のパラメーターをサポートしています
public class ListToMap {
public static void main(String[] args) {
List<User> users = new ArrayList<>();
users.add(new User(1, "user1", "[email protected]"));
users.add(new User(2, "user2", "[email protected]"));
users.add(new User(2, "user3", "[email protected]"));
users.add(new User(4, "user4", "[email protected]"));
Map<Integer, User> userIdAndUser = users.stream()
.collect(Collectors.toMap(User::getUserId, user-> user, (oldValue, newValue) -> newValue));
System.out.println(userIdAndUser);
}
}
复制代码
新しい値を選択して古い値を上書きし、結果を取得します
user3のみが表示され、user2が上書きされます。
- IDとユーザーリストのマッピング
上に表示された重複IDは、場合によってはリストにマップする必要がある場合、値に従って上書きされます。
つまり、List-> Map <Integer、List>の場合です。
これには、groupingByを使用する必要があります
public class ListToMap {
public static void main(String[] args) {
List<User> users = new ArrayList<>();
users.add(new User(1, "user1", "[email protected]"));
users.add(new User(2, "user2", "[email protected]"));
users.add(new User(2, "user3", "[email protected]"));
users.add(new User(4, "user4", "[email protected]"));
Map<Integer, List<User>> userMap = users.stream()
.collect(Collectors.groupingBy(User::getUserId));
System.out.println(userMap);
}
}
复制代码
ID2のデータが複数あります。
- マップタイプを指定します
Collectors.toMapは、マップタイプをインスタンス化するための4番目のパラメーターをサポートします
public class ListToMap {
public static void main(String[] args) {
List<User> users = new ArrayList<>();
users.add(new User(1, "user1", "[email protected]"));
users.add(new User(2, "user2", "[email protected]"));
users.add(new User(3, "user3", "[email protected]"));
users.add(new User(4, "user4", "[email protected]"));
Map<Integer, User> userIdAndUser = users.stream()
.collect(Collectors.toMap(User::getUserId, user-> user, (oldValue, newValue) -> newValue, ConcurrentHashMap::new));
System.out.println(userIdAndUser);
System.out.println(userIdAndUser.getClass());
}
}
复制代码
出力
userIdAndUserクラスのタイプはConcurrentHashMapです。