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

지구🌍·2023년 3월 18일
0

Effective Java 공부

목록 보기
12/12
post-thumbnail

스트림(Stream)

Java8에서 추가된 기능으로 컬렉션 데이터를 선언형으로 쉽게 처리할 수 있고 병렬처리를 별도의 멀티 스레드 없이 쉽게 구현할 수 있게 도와준다.

반복(loop)을 지원하지 않는 Stream

Stream은 반복을 지원하지 않는다.
Iterable의 추상 메소드를 모두 구현하고 있지만 정작 extand는 하고 있지 않기 때문!


iterator()Stream 인터페이스에 갖고 있기 때문에 for-each를 사용할 수 있긴하다!

for-each문 테스트

import java.util.stream.Stream;

public class Item47 {

    public static void main(String[] args) {
        Stream<String> fruits = Stream.of("바나나", "딸기", "메론", "오렌지");

        for (String fruit : fruits::iterator) {
            
        }
    }
}

컴파일 오류가 나는 현장...
컴파일러가 타입을 모르기 때문에 발생하였다.

import java.util.stream.Stream;

public class Item47 {

    public static void main(String[] args) {
        Stream<String> fruits = Stream.of("바나나", "딸기", "메론", "오렌지");

        for (String fruit : (Iterable<String>) fruits::iterator) {
            System.out.println("fruit = " + fruit);
        }
    }
}


형변환을 해주니 코드는 정상동작하지만 코드가 지저분해지고 별로다..

어댑터 메소드

for-each를 사용하니까 직관적이지 않으니까 어댑터 메소드를 사용하면 어떨까?

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

하지만 이 것도 java에서 제공해주는 것이 아니라 내가 직접 만들어야한다.

만약 메서드가 Stream 범위 내에서만 쓰인다면 → Stream을 반환해도 된다.

반환된 객체들이 반복문에서만 쓰인다면 → Iterable을 반환해도 된다.

잘 모르겠다. 둘 다 사용할 것 같다 → Collection 인터페이스를 사용하자! (공개 API의 반환 타입으로 최선의 선택이다.)

왜냐하면! Stream, Iterator를 모두 지원하기 때문이다.
원소 갯수가 많아지면 전용 컬렉션을 고려해보자~~

🎈귀중한 참고자료🎈
참고자료

profile
일취월장 하며 성장! 중! 공부한 것을 기록하자(^∀^●)ノシ

0개의 댓글