자바 7까지는 일련의 원소를 반환하는 메서드의 반환 타입으로 Collection, Set, List같은 컬렉션 인터페이스, Iterable, 배열을 사용했음
⇒ Stream이 등장하면서 반환 타입을 정하기 복잡해짐
스트림은 반복을 지원하지 않음
ex) for (T t : stream) { ... }
불가능
→ 반복과 스트림을 알맞게 조합해야 좋은 코드가 나옴
Stream이 Iterable을 확장하지 않기 때문에 for-each로 반복할 수 없음
스트림을 반복하기 위한 우회 방법
for(ProcessHandle processHandle : (Iterable<ProcessHandle>)ProcessHandle.allProcesses()::iterator){
// 프로세스 처리
}
→ 매개변수화된 Iterable로 적절히 형변환이 필요함 → 난잡하다!
// for-each 구문에서 사용할 수 있도록 stream<E>을 Iterable<E>로 감싼다
public static <E> Iterable<E> iterableOf(Stream<E> stream) {
return stream::iterator;
}
for(ProcessHandle processHandle : iterableOf(ProcessHandle.allProcesses())) {
// 프로세스 처리
}
→ 어댑터를 사용하면 따로 형변환하지 않아도 됨
스트림 파이프라인에서 사용되는지, 반복문에서 사용되는지에 따라 적절히 구현하면 됨
→ 여러 상황을 모두 고려해 두 가지 방법(스트림 파이프라인 전용, 반복문 전용)을 모두 구현하는 것이 좋음