Java8에서 추가된 기능으로 컬렉션 데이터를 선언형으로 쉽게 처리할 수 있고 병렬처리를 별도의 멀티 스레드 없이 쉽게 구현할 수 있게 도와준다.
Stream
은 반복을 지원하지 않는다.
Iterable
의 추상 메소드를 모두 구현하고 있지만 정작 extand
는 하고 있지 않기 때문!
iterator()
를 Stream
인터페이스에 갖고 있기 때문에 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
를 모두 지원하기 때문이다.
원소 갯수가 많아지면 전용 컬렉션을 고려해보자~~
🎈귀중한 참고자료🎈
참고자료