티스토리 뷰
Item47에서는 반환 타입으로 스트림 보다 컬렉션이 낫다고 한다
개발을 하면서 스트림을 반환 타입으로 메서드를 작성한 적이 없어 문득 궁금해졌다
스트림 반환과 관련해서 밸덩과 스택오버플로우 글을 찾아봤다
- https://www.baeldung.com/java-return-stream-collection
- https://stackoverflow.com/questions/24676877/should-i-return-a-collection-or-a-stream
컬렉션 반환은 data structure에 접근하는 것이고
스트림 반환은 data storage 안의 data source에 접근하는 것이다
어느 상황에 Stream을 반환해야 하는가에 대해서 스택오버플로우에 꽤나 정확한 답변이 있다
개발에서의 대부분에 적용되듯, 상황에 따라 다르다는 것이다
API를 사용하는 입장에서 컬렉션을 기대하는지, 스트림을 기대하는지가 가장 중요한 요소이고
어느 것이든 상관 없다면 반환 비용을 따져보면 된다
스트림을 반환하는게 유리한 상황은 다음과 같다
1. 반환 타입을 컬렉션으로 하는 것이 비용이 비싼 경우
2. 매우 크거나 혹은 무한 스트림인 경우
3. 유연성이 필요한 경우
4. 여러번 수행하더라도 데이터 소스를 변경하지 않는 연산이 필요한 경우
정리해보면 JVM 위에서 처리하기 버거울 정도로 수행해야 할 연산이 많이 필요할 때
사용자 입장에서 반환된 값을 받아서 변형은 하고 싶어도 데이터 소스 자체는 바꾸고 싶지 않을 때 유용하게 사용할 수 있다
다만 컬렉션을 쓰더라도 위와 같은 상황을 전부 지원 가능한데 스트림을 쓰면 사용자에게 어느 정도 자율권을 주는 것 같다
API는 스트림으로 주고 클라이언트 보고 알아서 '필터 걸고 리밋 걸고 써라' 하는 느낌?
사이즈가 무진장 클 때 Collection으로 반환하면 인 메모리 연산에서 터질 수도 있기 때문에
Stream으로 반환하고 클라이언트 측에서 source.limit(5) 식으로 짤라다가 사용하면 된다
자바 8 이전 버전도 지원과 범용적인 사용을 위해서는 컬렉션으로 반환해야 한다
스트림은 Iterable이 가지는 기능을 구현해놨으나 상속하지는 않았기 때문에 for-loop으로 직접 돌릴 수가 없다
'Java > Effective Java' 카테고리의 다른 글
[Item49] 유효성 검사와 입출력 모델 (0) | 2022.04.20 |
---|---|
[Item48] 병렬화 주의 (0) | 2022.04.16 |
[Item46] Stream과 Side-Effect (0) | 2022.04.07 |
[Item45] Stream vs For-Loop (0) | 2022.04.05 |
[Item44] 바퀴를 재발명 하지 말자 (0) | 2022.04.02 |