[JAVA]Stream.toList와 Stream.collect(toList())의 차이

yeonjoo913·2023년 8월 9일

JAVA

목록 보기
11/19

현재 프로젝에서는 JAVA17(LTS)을 사용하고 있는데, 이전 버전에서는 주로 Stream.collect(toList())을 사용하여 개발하였다. 17로 버전을 업데이트하고 나니 sonarlint에서 Stream.toList()로 변경하는 것을 권장하는데 이유가 무엇인지 궁금했다. 그리고 Stream.toList 와 Stream.collect(toList())는 무작정 서로 대체해도 사용해도 되는 것인지 궁금해서 공부해보았다.

Stream.collect(Collectors.toList())와 Stream.toList()는 똑같은 형태의 구현체로 반환되지 않는다.

  • Stream.collect(Collectors.toList())
    • Java 8부터
    • ArrayList 를 반환한다.
    • 수정이 허용된다.
    • Null 값이 허용된다.
  • Stream.collect(Collectors.toUnmodifiedableList())
    • Java 10부터
    • 수정이 불가능하다.
    • Null 값이 허용되지 않는다. NPE 발생한다.
  • Stream.toList()
    • Java 16부터
    • Collectors.UnmodifiableList 또는 Collectors.UnmodifiableRandomAccessList 를 반환한다.
    • 수정이 불가능하다
    • Null값이 허용된다.
    • Collector 인터페이스와 독립적이기 때문에 메모리를 덜 사용한다. Stream 요소를 List에 직접 축적한다. 따라서 스트림의 크기를 미리 알고 있으면 Stream.toList를 사용하는 것이 가장 좋다.

결론

IDE에서 Stream.toList()로 변경하는 것을 권장하는데 대체해서 사용해도 되는가? 무작정 대체해서 쓰는 것은 좋지않다. Stream.toList()의 경우 수정이 불가능한데, 로직에서 수정을 해야하는 경우가 발생한다면 Exception이 발생할 것이다. Stream.toList()는 NPE 발생과 수정 가능하다는 취약점을 보완할 수 있지만, 로직에서 변경된 부분을 적용해도 이슈가 없을지 잘 확인하고 사용하는 것이 중요하다. 테스트 코드를 잘 짜서 확인해보는 것이 필요할 것 같다.

profile
주니어 백엔드 개발자. 까먹는다 기록하자!

0개의 댓글