일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Android
- androidstudio
- bitmap
- BOJ
- Canvas
- CS
- Database
- DBeaver
- DP
- Ecilpse
- Eclipse
- firebase
- git
- github
- GooglePlayServices
- gradle
- IDE
- IntelliJ
- java
- json
- kotlin
- level2
- linux
- mariadb
- MYSQL
- Paint
- permission
- python
- Sorting
- sourcetree
Archives
will come true
[Java] Collectors.toMap() 변환 시 IllegalStateException 에러 발생 이유 본문
728x90
에러
Stream<Student> 타입을 Map<String, Student> 로 변환하는 과정에서 IllegalStateException 예외가 발생한다.
Student[] stuArr = {
new Student("이자바", 3, 300),
new Student("김자바", 1, 200),
new Student("안자바", 2, 100),
new Student("박자바", 2, 150),
new Student("나자바", 3, 290),
new Student("김자바", 3, 180)
};
Map<String, Student> stuMap = Stream.of(stuArr)
.collect(Collectors.toMap(s -> s.getName(), p->p));
Exception in thread "main" java.lang.IllegalStateException: Duplicate key [김자바, 1, 200]
at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
at java.util.HashMap.merge(HashMap.java:1254)
at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at ch14.StreamEx6.main(StreamEx6.java:32)
원인
Map<String, Student> 로 변환하는 과정에서 스트림의 요소인 Student 객체의 name 멤버를 Key로 지정했는데, 객체들 간에 이 값이 중복되는 요소가 있어 키(Key)가 중복된 것.
Map<Key, Value> 타입은 Value는 중복을 허용하나, Key는 중복을 허용하지 않는다.
해결
테스트용 Student[] 배열에서 name 값이 겹치는 요소의 값을 변경해준다.
Student[] stuArr = {
new Student("이자바", 3, 300),
new Student("김자바", 1, 200),
new Student("안자바", 2, 100),
new Student("박자바", 2, 150),
new Student("나자바", 3, 290),
new Student("강자바", 3, 180)
};
// 스트림을 Map<String, Student> 로 변환, 학생이름이 key
Map<String, Student> stuMap = Stream.of(stuArr)
.collect(Collectors.toMap(s -> s.getName(), p->p));
이때 Student 객체 그 자체를 가리키는 항등 함수는 람다식 p->p 대신 Function.identity()를 써도 된다.
// 스트림을 Map<String, Student> 로 변환, 학생이름이 key
Map<String, Student> stuMap = Stream.of(stuArr)
.collect(Collectors.toMap(s -> s.getName(), Function.identity()));
728x90
'Java' 카테고리의 다른 글
[Java] 이클립스 중단점(break point)에서 안멈추는거 해결 (0) | 2023.04.27 |
---|---|
[Java] Enumeration, Iterator, ListIterator 차이 (0) | 2021.12.18 |
[Java] 서울-뉴욕간의 시차를 구하는 문제에서 뉴욕의 ZoneOffset이 '-05:00'가 아니라 '-04:00'로 나오는 이유 (0) | 2021.10.23 |
[Eclipse] Failed to Download Index 오류 해결 (0) | 2021.10.22 |
[Java] Java 예제 풀이 (1) (0) | 2021.10.18 |
Comments