스트림은 반복(iteration)을 지원하지 않습니다.
음,, forEach() 메소드가 있긴한데 지원하지 않는다는 것은 어떤 의미일까요,, ?
좀 더 생각해보면 컬렉션처럼 Iterable 인터페이스 관련된 것을 사용하지 못한다는 뜻으로 해석이 되긴 하는데요
처음에는 forEach() 메소드를 말하나 했는데 그게 아니라 for-each문 그 자체를 말하는 거 같습니다.
API를 스트림만 반환하도록 짜놓으면 반환된 스트림을 for-each로 반복하는걸 원하는 사용자는 당연히 불만을 토로할 것이다.
- for-Each문과 Iterable 의 관계에 대해서 생각하게 하는 문장인 것 같습니다. 여기 를 참고해서 보면 좋을 것 같습니다.
Stream 인터페이스는 Iterable 인터페이스가 정의한 추상 메소드를 전부 포함할 뿐만 아니라, Iterable 인터페이스가 정의한 방식대로 동작합니다.
그럼에도 for-each로 스트림을 반복할 수 없는 이유는 바로 Stream이 Iterable을 확장(extend)하지 않아서 입니다.
이게 위에서 제가 궁금했던 이유에 대한 답인 것 같습니다. (아마두..)
- 책의 예시를 보면 컴파일에러 or 가독성과 직관성이 떨어지는 코드가 되는 큰 단점이 있습니다.
- P286 중개 어댑터를 구현해서 사용하는 방법도 있습니다.
- 단지 컬렉션을 반환하다는 이유로 덩치 큰 시퀀스를 메모리에 올려서는 안됩니다. (표준컬렉션 대신 전용컬렉션 사용)
- ex) 멱집합 -> 저에게 인덱스를 비트벡터로 사용하는 것은 위에 내용 때문인 것은 알겠는데 와닿지는 않는 거 같습니다.
- contains와 size 메소드를 구현하는 게 불가능할 때는 컬렉션보다는 스트림이나 Iterable을 반환하는 편이 낫습니다.
- 입력리스트의 모든 부분 리스트를 구현해야 할 때 (컬렉션에 담는 코드로 작성하면 리스트 크기의 거듭제곱 만큼 메모리를 차지하게 되지만 스트림을 사용하면 단순하게 가능합니다.)
- 원소 시퀀스를 반환하는 메소드를 작성할 때는, 이를 스트림으로 처리하기를 원하는 사용자와 반복으로 처리하길 원하는 사용자가 모두 있을 수 있음을 떠올리자.
- 컬렉션을 담아도 될 정도로 원소의 수가 적다면 새로운 표준 컬렉션, 그렇지 않다면 전용 컬렉션을 구현하기
- 컬렉션을 반환하는게 불가능하면 스트림과 Iterable 중 하나 반환하기