스터디/이펙티브 자바

[Effective Java] Item47. 반환 타입으로는 스트림보다 컬렉션이 낫다

📝 작성 : 2022.07.10  ⏱ 수정 : 
728x90

스트림 반복

Stream 인터페이스는 Iterable 인터페이스의 추상 메서드를 모두 포함하고 있고, 정의한 방식대로 동작하지만 Iterable 을 확장하지는 않았기 때문에 for-each로 반복할 수 없습니다.
만약 Stream을 반복문으로, 또는 그 반대로 사용하고 싶은 경우에는 중개해주는 어댑터를 사용합니다.

Stream -> Iterable

public static <E> Iterable<E> iterableOf(Stream<E> stream){
    return stream::iterator;
}
for (ProcessHandle p : iterableOf(ProcessHandle.allProcesses())) {
    // ...
}

Iterable -> Stream

public static Iterable<E> streamOf(Iterable<E> iterable){
    return StreamSupport.stream(iterable.spliterator(), false);
}

Collection 반환

Collection 인터페이스는 Iterable의 하위 타입이며 stream 메서드도 제공하므로 반복과 스트림 모두 사용할 수 있습니다. 따라서 원소 시퀀스를 반환하는 공개 API의 반환타입으로 Collection이나 그 하위 타입을 사용하는 것이 더 좋습니다.
이 때, 덩치가 큰 시퀀스를 메모리에 올려서는 안됩니다. 원소 수가 많다면 전용 컬렉션 구현을 고려해보아야 합니다.

전용 컬렉션

AbstractCollection의 하위타입 AbstractList, AbstractSet 등을 이용해 전용 컬렉션을 쉽게 구현할 수 있습니다.
이 때 반드시 구현해야할 메서드가 있습니다.

  • Iterable용 메서드
  • contains
  • size
    만약, contains와 size 메서드를 구현하는게 불가능하다면 Stream이나 Iterable로 구현하는 것이 낫습니다.
반응형