99클럽 7일차 TIL: Collectors.toList() vs. toList()

2024. 4. 10. 14:4599클럽/TIL

반응형

#1. 오늘의 학습 키워드

자바스프링에서의 Stream 을 사용해 filter, map 등을 쓴 뒤 stream을 다시 리스트로 만들어서 리턴하고 싶을 때, 사용 가능한 두 가지 메서드 중 어떤 거를 선택해야 될까?

  • 자바 스프링으로 개발을 하다보면, 리스트에 대해서 map, filter 등 stream 메서드를 적용해야되는 경우가 많다. 그런데 그 직후 intellij 에서 제공해주는 메서드가 두가지가 있는데, 이를 혼용해도 상관이 없을까 하였는데, 그게 아니었다.
    • 일반적으로 intellij 는 toList()를 쓰도록 권장을 한다.
      • 그러나 바꾸고 나서 오류가 뜨는 상황이 오히려 생길 때도 있다.
    • collect(Collectors.toList())
      • 자바 stream의 collect 메서드를 사용하여 요소를 리스트로 수집하는 것을 의미
      • Collectors.toList() 는 스트림에서 요소를 수집하여 리스트를 반환한다.
    • toList()
      • 자바 16부터 도입된 stream의 새로운 메서드
      • Collectors.toList()와 기능적으로는 동일
  • 컴파일 타임에서 Collectors.toList() 를 사용했을 때는 문제가 없다가, toList() 를 사용했을 때 문제가 생기는 경우가 있었다.

#2. 공부한 내용

  • 주요 차이점
    1. 수정 가능 여부
      • Collectors.toList()
        • ArrayList 를 반환한다.
        • 즉 반환되는 리스트는 수정이 가능함
      • toList()
        • unmodifiable List 를 반환한다.
        • 즉 반환되는 리스트는 수정이 불가능함.
    2. 버전 지원 차이
      • Collectors.toList()
        • 자바 8 이상
      • toList()
        • 자바 16이상
    3. *java generic type erasure
      • Collectors.toList()
        • 와일드카드 허용
        • 유연성 제공
      • toList()
        • stream 의 요소 타입으로 그대로 반환
        • 그렇기에 같은 상황이더라도 collectors.toList() 일 때와 달리 오류가 생길 수 있음
      • 컴파일 타임에서 IDE는 toList()를 권장하다가, 정작 런타임 때 toList()가 오류가 날 수도 있음
//오류 X
List<Number> list = Stream.of("1", "2", "3")
         .map(Integer::parseInt)
         .collect(Collectors.toList());
         
//오류 O 
List<Number> list = Stream.of("1", "2", "3")
         .map(Integer::parseInt)
         .toList();
         
//오류 O        
List<Number> list = Stream.of("1", "2", "3")
                .<Number>map(Integer::parseInt)
                .toList();

#3. 오늘의 회고

  • 명칭이 비슷하고, 용도가 거의 흡사한 두 메서드가 있을 때, 더 복잡하고, IDE도 외면하더라도 아직 deprecated 가 되지 않았다면, 필히 다른 용도가 있으리라 생각하는 게 좋을 것 같다.
    • 즉 IDE 가 유도하는 대로 편한 길로만 걷다가는 이런 사소한 차이를 놓치기가 쉽고, 이런 이유로 추후 오류가 생겼을 때 간과하는 지점들이 생겨나갈 마련이다.
반응형