Skip to content

Latest commit

 

History

History
80 lines (51 loc) · 2.08 KB

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

File metadata and controls

80 lines (51 loc) · 2.08 KB

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

원소 시퀀스의 반환 타입

  • Collection, Set, List 같은 컬렉션 인터페이스
  • Iteration
  • 배열
  • 자바 8이후 Stream이 추가됨

Stream은 반복을 지원하지 않음

Iterable의 추상메서드를 모두 구현하고 있지만 Stream이 Iterable을 확장(extend)하지 않았기 때문

for (ProcessHandle ph : ProcessHandle.allProcesses()::iterator) { // 컴파일 에러
            // 프로세스를 처리한다.
}
  • ProcessHandle.allProcesses() : 프로세스의 Stream을 반환
  • Iterable을 확장하지 않았기 때문에 컴파일 에러

Stream을 반복하기 위한 끔찍한 우회 방법

for(ProcessHandle ph : (Iterable<ProcessHandle>) ProcessHandle.allProcesses()::iterator{
            // 프로세스를 처리한다.
}
  • 실전에서 쓰기에는 너무 난잡하고 직관성이 떨어짐

Stream을 Iterable로 중개해주는 어댑터

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

for(ProcessHandle processHandle : iterableOf(ProcessHandle.allProcesses())) {
    // 프로세스 처리
}
  • 형 변환이 좀 더 직관적으로 바뀜

객체 시퀀스를 반환하는 메서드의 반환 타입

  • 메서드가 Stream 파이프라인에서만 사용되는 경우 → Stream 반환
  • 반환된 객체들이 반복문에서만 사용되는 경우 → Iterable 반환

하지만 공개 API의 경우 두가지 상황 모두 고려해야 함

→ 원소 시퀀스를 반환하는 공개 API의 반환 타입을 Collection으로 하자


Collection을 사용하는 이유

  • Iterable의 하위 타입
  • Stream 반환 메서드를 제공

반환할 시퀀스가 너무 큰 경우

  • 컬렉션을 반환한다는 이유로 덩치 큰 시퀀스를 메모리에 올리는 것은 불필요한 일
  • 표현을 간결하게 할 수 있다면 전용 컬렉션 구현을 고려해보자

결론

  • 원소 시퀀스를 반환할 때 컬렉션을 사용하자