[아이템 47] 반환 타입으로는 스트림보다 컬렉션이 낫다.

Jimin Lim·2023년 7월 2일
0

Effective Java

목록 보기
31/38
post-thumbnail

아이템 47

반환 타입으로는 스트림보다 컬렉션이 낫다.

✅ Stream의 문제점

스트림은 iteration을 지원하지 않는다. 따라서 API를 스트림만 반환하도록 쩌놓으면 for-each로 반복하길 원하는 사용자는 이를 사용하기 까다롭다.

// Stream 인터페이스
public interface Stream<T> extends BaseStream<T, Stream<T>> {
}

public interface BaseStream<T, S extends BaseStream<T, S>>
        extends AutoCloseable {

    Iterator<T> iterator();
}

Stream 인터페이스는 Interable 인터페이스가 정의한 추상 메서드를 전부 포함하고, Iterable 인터페이스가 정의한 방식대로 동작한다.
하지만 Stream이 Iterable을 extend하지 않아 for-each로 반복할 수 없다.

✅ 반복하기 위한 우회방법

for(ProcessHandle ph : (Iterable<ProcessHandle>)ProcessHandle.allProcesses()::iterator){
   //프로세스를 처리한다.
}

위와 같이 ProcessHandle.allProcesses() 이 반환하는 Stream을 반복하기 위해 우회할 수 있지만, 직관성이 떨어진다.

public static <E> Iterable<E> iterableOf(Stream<E> stream) {
    return stream::iterator;
}

for(ProcessHandle processHandle : iterableOf(ProcessHandle.allProcesses())) {
    // 프로세스 처리
}

Stream -> Iterable 로 변환해주는 어댑터를 만든다면 더 나을 수 있다.

✅ Collection

Collection 인터페이스는 Iterable의 하위 타입이고 stream 메서드도 제공하니 반복과 스트림을 동시에 지원한다. 따라서 원소 시퀀스를 반환하는 공개 API의 반환 타입에는 Collection이나 그 하위 타입을 쓰는게 최선이다.

예를 들어, Arrays는 Arrays.asListStream.of 와 같이 쉽게 반복과 스트림을 지원할 수 있다.

profile
💻 ☕️ 🏝 🍑 🍹 🏊‍♀️

0개의 댓글