Java 16, Stream의 toList() 사용시 UnsupportedOperationException 이 발생했던 이야기

2063 단어 JavaJava

Java 16에서는 Stream에서 편리하게 List를 만들어 주는 toList()가 존재한다. 그러나 나처럼 함부로 사용을 하게 되면 문제가 발생하는데...

문제가 발생했던 상황은 아래와 같다.

List<Integer> result = Stream.of(19,21,17).toList();
result.sort(Comparator.naturalOrder());

기존에는 Stream의 .collect(Collectors.toList()) 를 이용해서 List 형태로 값을 돌려 받았었는데, 못된 Intellij 가 나에게 toList()를 사용하라고 문구를 띄워줬고 위와 같이 변경을 했다.
그 결과 아래와 같은 에러가 발생했다.

Exception in thread "main" 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 com.chb.chapter3.Problem4.solution(Problem4.java:22)
	at com.chb.chapter3.Problem4.main(Problem4.java:16)

위의 에러가 발생 한 이유는 toList() 를 이용해 제공 받은 List가 unmodifiableList() 를 통해 변경이 불가능하게 되었기 때문이다.

toList() 함수 내부는 아래와 같았다.

    @SuppressWarnings("unchecked")
    default List<T> toList() {
        return (List<T>) Collections.unmodifiableList(new ArrayList<>(Arrays.asList(this.toArray())));
    }

toList() 를 사용해 결과를 받게 되면 수정이 불가능 하므로 아래와 같이 기존에 사용하던 방식을 사용해 해결하면 될 것으로 보인다

List<Integer> result = Stream.of(19,21,17).collect(Collectors.toList());
result.sort(Comparator.naturalOrder());

Intellij 에서 안내 해주는 것을 너무 신용하면 안될 것 같다.

좋은 웹페이지 즐겨찾기