[Java] Collectors.toList() vs Collectors.toUnmodifiableList() vs Stream.toList()

일단 해볼게·2023년 8월 23일

Collectors.toList()

  • ArrayList를 반환한다.

  • 수정이 가능하다.
  • Null을 허용한다.
  • Java8 버전에서 나왔다.
@DisplayName("Collectors.toList() 수정 가능 테스트")
  @Test
  public void collectorsToList() {
    List<String> modifiable = Stream.of("a", "b")
        .collect(Collectors.toList());

    modifiable.add("c");

    assertEquals(3, modifiable.size());
  }

Collectors.toUnmodifiableList()

  • Collectors.toList()가 수정이 가능해서 수정 불가능한 List를 반환하기 위해 등장했다.
  • Null을 허용하지 않는다.

- Null이 들어가면 `Null Pointer Exception`이 발생한다.
  • Java10 버전에서 나왔다.
@DisplayName("Collectors.toUnmodifiableList() 수정 불가능 테스트")
  @Test
  public void collectorsToUnmodifiableList() {
    List<String> collectorsToUnmodifiableList = Stream.of("a", "b")
        .collect(Collectors.toUnmodifiableList());

    assertThrows(UnsupportedOperationException.class,
        () -> collectorsToUnmodifiableList.add("c"));
  }

Collectors.toUnmodifiableList()에 “c”를 추가하려하면 UnsupportedOperationException이 발생한다.


Stream.toList()

  • toUnmodifiableList()의 이름이 길어서 보완하기 위해 등장했다.

  • 수정이 불가능하다.
    • 수정할 경우 UnsupportedOperationException.class 예외가 발생한다.
      • RuntimeException의 구현체로 런타임 시점에 알 수 있어 코드를 실행하기 전에는 알 수 없다.
  • Null을 허용한다.
  • Java16 버전에서 나왔다.
@DisplayName("Stream.toList() 수정 불가능 테스트")
  @Test
  public void streamToList() {
    List<String> streamToList = Stream.of("a", "b").toList();

    assertThrows(UnsupportedOperationException.class,
        () -> streamToList.add("c"));
  }

Stream.toList()에 “c”를 추가하려하면 UnsupportedOperationException이 발생한다.

정리

Collectors.toList()Collectors.toUnmodifiableList()Stream.toList()
수정 가능한지?수정 가능수정 불가능수정 불가능
리스트 안에 Null 추가 가능한지?Null 가능Null 불가능 (UnsupportedOperationException)Null 가능
도입된 Java 버전Java 8Java 10Java 16

참고

https://velog.io/@cieroyou/Stream을-List로-변환하는-다양한-방법과-차이Collectors.toList-vs-Stream.toList

https://binux.tistory.com/146

profile
시도하고 More Do하는 백엔드 개발자입니다.

0개의 댓글