티스토리 뷰
728x90
반응형
반환 타입으로는 스트림보다 컬렉션이 낫다
- 원소 시퀀스, 즉 일련의 원소를 반환하는 메서드는 수 없이 많았습니다. 자바 8이전까지는 Collection, Set, List와 같은 컬렉션 인터페이스 또는 Iterable이나 배열을 사용했습니다. 하지만 자바 8이후로 Stream이 등장하며 복잡해졌습니다.
- for-each 문에서만 사용이 되거나 반환된 원소 시퀀스가 일부 Collcetion 메서드를 구현할 수 없는 경우에는 Iterable 인터페이스를 사용하곤 했습니다. 그리고 반환 원소들이 기본 타입이거나 성능에 민감한 상황이라면 배열을 사용했습니다.
💡 반복을 지원하지 않는 Stream
- Stream과 Stream의 상위 객체인 BaseStream은 모두 Iterable 인터페이스를 구현하거나 상속하지 않습니다. 그럼에도 Iterable 인터페이스가 정의한 추상 메서드를 전부 포함하고 Iterable 인터페이스가 의도하는 방식으로 동작합니다.
public interface BaseStream<T, S extends BaseStream<T, S>> extends AutoCloseable {
...
}
public interface Stream<T> extends BaseStream<T, Stream<T>> {
}
💡 BaseStream의 iterator 메서드 ?
- BaseStream 인터페이스의 iterator 메서드를 사용하면 for-each를 사용할 수 있지 않을까?
- 막상 사용을 하면 컴파일 오류가 발생합니다.
- 형변환을 하여 컴파일 오류가 없어진것을 볼 수 있습니다. 하지만 실전에서는 사용하기 어렵고 직관적이지 않습니다. 이런 경우 어댑터 메서드를 사용하면 문제를 해결할 수 있습니다.
💡 어댑터 메서드
- 코드가 직관적이고 명시적으로 바뀌었습니다.
public class Example {
public static void main(String[] args) {
Stream<String> stream = Stream.of("A", "C", "D");
List<String> list = Arrays.asList("A", "C", "D");
for (String s : iterableOf(stream)) {
System.out.println(s);
}
streamOf(list).forEach(System.out::println);
}
// return For-each
public static <E> Iterable<E> iterableOf(Stream<E> stream) {
return stream::iterator;
}
// return Stream
public static <E> Stream<E> streamOf(Iterable<E> iterable) {
return StreamSupport.stream(iterable.spliterator(), false);
}
}
💡 Collection vs Stream
- Collection - Collection 인터페이스는 Iterable 인터페이스의 하위 타입이고 stream 메서드도 제공하니 일반적으로 Collection을 반환하는게 좋습니다. 하지만 Collectio의 각 원소는 메모리에 올라가니, 시퀀스의 크기가 크다면 고민해보는게 좋습니다.
public interface Iterable<T> {
}
public interface Collection<E> extends Iterable<E> {
}
- Stream - 컬렉션의 contains와 size를 시퀀스의 내용을 확정하기 전까지 구할 수 없는 경우(실제 반복을 돌려 보기전까지 무엇이 얼마나 들어갈지 예측이 불가능한 경우) Stream을 반환하는게 좋습니다.
728x90
반응형
'스터디 > 이펙티브 자바' 카테고리의 다른 글
이펙티브 자바 - Item49. 매개변수가 유효한지 검사하라 (0) | 2022.08.02 |
---|---|
이펙티브 자바 - Item48. 스트림 병렬화는 주의해서 적용하라 (0) | 2022.08.01 |
이펙티브 자바 - Item46. 스트림에서는 부작용 없는 함수를 사용하라 (0) | 2022.07.31 |
이펙티브 자바 - Item45. 스트림은 주의해서 사용하라 (0) | 2022.07.31 |
이펙티브 자바 - Item44. 표준 함수형 인터페이스를 사용하라 (0) | 2022.07.30 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- spring boot redis 대기열 구현
- 람다 표현식
- spring boot excel download oom
- transactional outbox pattern
- redis 대기열 구현
- spring boot 엑셀 다운로드
- microkernel architecture
- pipe and filter architecture
- service based architecture
- pipeline architecture
- JDK Dynamic Proxy와 CGLIB의 차이
- space based architecture
- redis sorted set
- transactional outbox pattern spring boot
- 트랜잭셔널 아웃박스 패턴 스프링 부트 예제
- java userThread와 DaemonThread
- spring boot excel download paging
- 자바 백엔드 개발자 추천 도서
- 레이어드 아키텍처란
- java ThreadLocal
- polling publisher spring boot
- 공간 기반 아키텍처
- redis sorted set으로 대기열 구현
- 서비스 기반 아키텍처
- spring boot redisson destributed lock
- spring boot poi excel download
- 트랜잭셔널 아웃박스 패턴 스프링부트
- @ControllerAdvice
- spring boot redisson sorted set
- spring boot redisson 분산락 구현
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함