반응형
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다.
아이템 47. 반환 타입으로는 스트림보다 컬렉션이 낫다.
원소 시퀀스
- 일련의 원소를 반환하는 메서드 ex) Collection, Set, List, Iterable, 배열
- 기본은 컬렉션 인터페이스이다.
- 자바 8이 스트림을 지원하기 시작하면서 적합한 타입을 선택하는 것은 복잡해졌다.
- 스트림은 반복을 지원하지 않기 때문에, 스트림과 반복을 알맞게 조합해야 좋은 코드가 나온다.
ex 1) 자바 타입 추론 실패 예
for (ProcessHandle ph : ProcessHandle.allProcesses()::iterator) {
// 프로세스를 처리한다.
}
- 이 코드는 컴파일 오류가 발생한다.
ex 2) 스트림을 반복시킨 좋지 않은 예
for (ProcessHandle ph : (Iterable<ProcessHandle>)
ProcessHandle.allProcess()::iterator) {
// 프로세스를 처리한다.
}
- 작동은 하지만 너무 난잡하고 직관성이 떨어진다.
ex 3) Steam<E>를 Iterable<E>로 중개하는 어댑터를 사용한 예
public static <E> Iterable<E> iterableOf(Stream<E> stream) {
return stream::iterator;
}
for (ProcessHandle p : iterableOf(ProcessHandle.allProcesses())) {
// 프로세스를 처리한다.
}
- 이렇게 어댑터를 작성해서 잘 사용하면 어떤 스트림도 for-each 문으로 반복할 수 있다.
ex 4) 반대로, Iterable<E>를 Stream<E>로 중개해주는 어댑터
public static <E> Stream<E> streamOf(Iterable<E> iterable) {
return StreamSupport.stream(iterable.spliterator(), false);
}
- 객체 시퀀스를 반환하는 메서드를 작성하는데, 이 메서드가 오직 스트림 파이프라인에서만 쓰일 걸 안다면 스트림을 반환하자.
- 반환된 객체들이 반복문에서만 쓰일 걸 안다면 Iterable을 반환하자.
- 공개 API를 작성할 때는 스트림 파이프라인을 사용하는 사람과 반복문에서 쓰려는 사람 모두 배려해야 한다.
Collection & Iterable
- Collection 인터페이스는 Iterable의 하위 타입이고 stream 메서드도 제공하니 반복과 스트림을 동시에 지원한다.
- 원소 시퀀스를 반환하는 공개 API의 반환 타입에는 Collection이나 그 하위 타입을 쓰는 게 일반적으로 최선이다.
- Arrays는 Arrays.asList와 Stream.of 메서드로 손쉽게 반복과 스트림을 지원할 수 있다.
- 단지 컬렉션을 반환한다는 이유로 덩치 큰 시퀀스를 메모리에 올리지는 말자.
- 반환할 시퀀스가 크지만 표현을 간결하게 할 수 있다면 전용 컬렉션을 구현해보자.
정리
- 원소 시퀀스를 반환하는 메서드를 작성할 때, 스트림으로 처리하길 원하는 사용자와 반복으로 처리하길 원하는 사용자를 모두 만족시키자
- 반환 전부터 이미 원소들을 컬렉션에 담아 관리하고 있거나 컬렉션을 하나 더 만들어도 될 정도로 원소 개수가 적다면 ArrayList 같은 표준 컬렉션에 담아 반환하자.
- 그렇지 않다면 전용 컬렉션을 구현할 지 고민해보자
- 컬렉션을 반환하는게 불가능하다면, 스트림과 Iterable 중 자연스러운 것을 반환하자.
- 나중에 Stream 인터페이스가 Iterable을 지원하게 된다면 안심하고 Stream을 반환하면 될 것이다.
반응형
'BE > Java' 카테고리의 다른 글
[Effective Java] 아이템 49. 매개변수가 유효한지 검사하라 (0) | 2022.11.10 |
---|---|
[Effective Java] 아이템 48. 스트림 병렬화는 주의해서 적용하라 (0) | 2022.11.09 |
[Effective Java] 아이템 46. 스트림에서는 부작용 없는 함수를 사용하라 (0) | 2022.11.07 |
[Effective Java] 아이템 45. 스트림은 주의해서 사용하라 (1) | 2022.11.04 |
[Effective Java] 아이템 44. 표준 함수형 인터페이스를 사용하라 (0) | 2022.11.03 |