매핑할 Java8 스트림 목록

계속 만들고 성장을 가속화하십시오! "너겟 데일리 뉴플랜 · 6월 업데이트 챌린지" 참여 4일차 입니다 . 이벤트 상세보기 클릭

  • UserInfo 클래스가 있습니다.

JAVA8을 통한 스트림 작업은 userId를 키로, 이름을 값으로 사용하는 맵으로 변환해야 합니다.

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로 변경했습니다.

Collectors.toMap은 중복 값을 선택하는 세 번째 매개변수를 지원합니다.

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);
    }
}
复制代码

ID가 2인 데이터가 여러 개 있습니다.

  • 지도 유형 지정

Collectors.toMap은 지도 유형을 인스턴스화하는 네 번째 매개변수를 지원합니다.

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