Item 47. 반환 타입으로는 stream보다는 collection이 낫다.
stream은 반복을 지원하지 않으므로, API를 stream만 반환하도록 짜놓으면 반환된 stream을 for-each로 반복하길 원하는 사용자는 사용이 힘들다
stream은 Iterable 인터페이스가 정의한 추상 method를 모두 포함할뿐 아니라, Iterable 인터페이스가 명시한 스펙대로 동작하지만 Iterable을 확장하고 있지는 않기 때문에 for-each문으로 반복이 불가능하다.
따라서 stream의 iterator method에 method 참조를 건네고, 이를 매개변수화된 Iterable로 적절히 형변환하면 동작은 한다.
1 | for(ProcessHandle ph: (Iterable<ProcessHandler>) ProcessHandle.allProcesses()::iterator){ |
adapter method
하지만 이렇게 stream을 사용하기는 가독성이 떨어지므로, adapter method를 사용하는 방안이 있다.
1 | // Stream<E> 를 Iterable<E>로 중개해주는 adapter |
adapter method를 사용하면 어떤 stream도 for-each문으로 반복할 수 있다.
1 | for(ProcessHandle p : iterableOf(ProcessHandle.allProcesses())){ |
반대의 상황으로서 API가 iterable만 반환하면 이를 stream 으로 사용하고자 하는 사용자는 사용이 힘들다. 따라서 adapter method를 제공하는 방안이 있다.
1 | // Iterable<E>를 Stream<E>로 중개해주는 adapter |