계속 만들고 성장을 가속화하십시오! "너겟 데일리 뉴플랜 · 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입니다.