- Collection, Set, List 같은 컬렉션 인터페이스
- Iteration
- 배열
- 자바 8이후 Stream이 추가됨
Iterable의 추상메서드를 모두 구현하고 있지만 Stream이 Iterable을 확장(extend)하지 않았기 때문
for (ProcessHandle ph : ProcessHandle.allProcesses()::iterator) { // 컴파일 에러
// 프로세스를 처리한다.
}
- ProcessHandle.allProcesses() : 프로세스의 Stream을 반환
- Iterable을 확장하지 않았기 때문에 컴파일 에러
for(ProcessHandle ph : (Iterable<ProcessHandle>) ProcessHandle.allProcesses()::iterator{
// 프로세스를 처리한다.
}
- 실전에서 쓰기에는 너무 난잡하고 직관성이 떨어짐
public static <E> Iterable<E> iterableOf(Stream<E> stream) {
return stream::iterator;
}
for(ProcessHandle processHandle : iterableOf(ProcessHandle.allProcesses())) {
// 프로세스 처리
}
- 형 변환이 좀 더 직관적으로 바뀜
- 메서드가 Stream 파이프라인에서만 사용되는 경우 → Stream 반환
- 반환된 객체들이 반복문에서만 사용되는 경우 → Iterable 반환
하지만 공개 API의 경우 두가지 상황 모두 고려해야 함
→ 원소 시퀀스를 반환하는 공개 API의 반환 타입을 Collection으로 하자
- Iterable의 하위 타입
- Stream 반환 메서드를 제공
- 컬렉션을 반환한다는 이유로 덩치 큰 시퀀스를 메모리에 올리는 것은 불필요한 일
- 표현을 간결하게 할 수 있다면 전용 컬렉션 구현을 고려해보자
- 원소 시퀀스를 반환할 때 컬렉션을 사용하자