Java 16 이후, 자바에서는 Stream.toList()라는 새로운 메서드를 제공하여 기존의 collect(Collectors.toList()) 방식을 대체할 수 있게 되었습니다.
✅ 핵심 차이점 요약
| 항목 |
collect(Collectors.toList()) |
Stream.toList() |
| 도입 버전 |
Java 8 이상 |
Java 16 이상 |
| 반환 타입 |
ArrayList or other mutable list |
불변 리스트 (Immutable List) |
| 외부 라이브러리 의존 |
필요 (Collectors) |
불필요 |
| 변경 가능 여부 |
가능 (mutable) |
불가능 (immutable) |
| 스레드 안정성 |
불안정 |
불안정 (불변이지만 thread-safe 아님) |
📌 예시 코드 비교
1. Java 8 방식 - Collectors.toList()
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
List<String> list = Stream.of("a", "b", "c")
.collect(Collectors.toList());
list.add("d"); // 가능
System.out.println(list); // [a, b, c, d]
2. Java 16 방식 - Stream.toList()
import java.util.List;
import java.util.stream.Stream;
List<String> list = Stream.of("a", "b", "c")
.toList();
list.add("d"); // UnsupportedOperationException 발생
⚠️ 주의할 점
toList()로 생성된 리스트는 불변(immutable) 이므로 add, remove 등의 조작이 불가능합니다.
Collectors.toList()는 매번 새로운 ArrayList를 생성하며, 수정 가능한 리스트를 원할 때 사용합니다.
- 프로젝트에서 Java 16 이상을 사용한다면, 불변 리스트가 필요한 경우에만
toList()를 활용하세요.
🧾 정리
- Java 8 이하: 무조건
collect(Collectors.toList()) 사용
- Java 16 이상:
- 리스트 수정이 필요하면
Collectors.toList()
- 불변 리스트가 필요하면
toList() 추천
- 코드 가독성 면에서는
toList()가 간결하고 선언적입니다.