マップへのJava8ストリームリスト

創造を続け、成長を加速させましょう!「ナゲッツデイリーニュープラン・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です。

おすすめ

転載: juejin.im/post/7104574874345013284