반응형
jdk17 버전부터 Stream 연산 후 결과를 Stream.toList() 로 return 할 수 있는데요
public class UnsupportedOperationExceptionTest {
@Test
void unsupportedOperationExceptionTest() {
Stream<String> stream =
Stream.<String>builder()
.add("ccc")
.add("aaa")
.add("bbb")
.build();
List<String> list = stream.toList();
Collections.sort(list);
}
}
이런 코드를 실행시키면 아래와 같이 UnsupportedOperationException 이 발생합니다
java.lang.UnsupportedOperationException
at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:142)
at java.base/java.util.ImmutableCollections$AbstractImmutableList.sort(ImmutableCollections.java:261)
at java.base/java.util.Collections.sort(Collections.java:145)
...
public interface Stream<T> extends BaseStream<T, Stream<T>> {
@SuppressWarnings("unchecked")
default List<T> toList() {
return (List<T>) Collections.unmodifiableList(new ArrayList<>(Arrays.asList(this.toArray())));
}
}
반응형
toList() 메서드는 위 코드와 같이 unmodifiableList를 return 합니다. Stream 에서 return된 unmodifiableList를 Collections.sort() 메서드로 수정을 시도해서 그런 것인데요
unmodifiableList가 필요한 상황이라면 복사해서 사용하도록 하고, unmodifiableList가 굳이 필요하지 않다면 기존의 jdk8 버전부터 많이 사용하던 Stream.collect(Collectors.toList()) 를 사용해도 되겠습니다
(Stream.collect(Collectors.toUnmodifiableList()) 를 사용해도 Stream.toList() 를 사용한 결과와 동일하게 UnsupportedOperationException 이 발생합니다...)
반응형
'소프트웨어' 카테고리의 다른 글
java.lang.NoClassDefFoundError: com/querydsl/apt/AbstractQuerydslProcessor 에러 해결 (0) | 2023.12.16 |
---|---|
ChatGPT 장애 (Oops! Our systems are ...) (0) | 2023.11.23 |
DriverManager는 어떻게 Driver를 찾을까..? (0) | 2022.05.25 |
정적 팩터리 메서드는 생성자보다 좋을까? (0) | 2021.09.15 |
Spring - 중복 타입으로 자동주입 (0) | 2021.09.04 |