스트림 반복
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로 구현하는 것이 낫습니다.
반응형
'스터디 > 이펙티브 자바' 카테고리의 다른 글
[Effective Java] Item49. 매개변수가 유효한지 검사하라 (0) | 2022.07.10 |
---|---|
[Effective Java] Item48. 스트림 병렬화는 주의해서 사용하라 (0) | 2022.07.10 |
[Effective Java] Item46. 스트림에서는 부작용 없는 함수를 사용하라 (0) | 2022.07.10 |
[Effective Java] Item45. 스트림은 주의해서 사용하라 (0) | 2022.07.10 |
[Effective Java] Item 44. 표준 함수형 인터페이스를 사용하라 (0) | 2022.07.03 |