Stream 인터페이스는 BaseStream을 상속받는다.
Stream을 보기전에 미리 BaseStream을 볼 필요가 있다.
Stream을 보기전에 미리 BaseStream을 볼 필요가 있다.
public interface Stream<T> extends BaseStream<T, Stream<T>> {
...
BaseStream은 AutoCloseable인터페이스를 상속받고 다음과 같은 몇가지의 함수들을 가지고 있다.
public interface BaseStream<T, S extends BaseStream<T, S>>
extends AutoCloseable {
Iterator<T> iterator();
spliterator<T> spliterator();
boolean isParallel();
S sequential();
S parallel();
S unordered();
S onClose(Runnable closeHandler);
@Override
void close();
}
자바8 이후에서 인터페이스는 함수를 선언으로만 끝내지 않고 정의까지 포함한다. 그 대표적인 예가 람다식을 사용하는 @FunctionalInterface( https://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html) 이다. 하지만 BaseStream은 선언부만 정의되어있다. 즉 상속받는곳에서 입맛에 맛게 오버라이드 하여 사용하고 있다.
/**
* Returns an iterator for the elements of this stream. * * <p>This is a <a href="package-summary.html#StreamOps">terminal
* operation</a>.
* * @return the element iterator for this stream
*/
Iterator<T> iterator();
Stream의 엘리먼트들을 접근할 수 있는 Iterator를 반환해준다.
IntStream ins1 = IntStream.range(0, 10);
Iterator<Integer> it1 = ins1.iterator();
int sum0 = 0;
while(it1.hasNext()){
sum0 += it1.next();
}
System.out.println(sum0); -> 45
Stream을 일반적으로 사용하는 Iterator와 동일하게 사용할 수 있다.
/**
* Returns a spliterator for the elements of this stream. * * <p>This is a <a href="package-summary.html#StreamOps">terminal
* operation</a>.
* * @return the element spliterator for this stream
*/
Spliterator<T> spliterator();
주석만 읽어보면 Iterator와 다를것 없어보이지만 Spliterator에 대해 알필요가 있다. 자바8에서 생겨난 인터페이스며 기존의 Iterator와는 다른 역할을 한다. spliterator 는 처리할 작업을 분할해서 수행할때 사용한다. 병렬처리할때 유용하다.
/**
* Returns whether this stream, if a terminal operation were to be executed, * would execute in parallel. Calling this method after invoking an * terminal stream operation method may yield unpredictable results. * * @return {@code true} if this stream would execute in parallel if executed
*/
boolean isParallel();
이 스트림의 터미널 오퍼레이션, 즉 마지막에 실행되는 종료함수를 병렬로 처리할지 여부를 반환해준다.
/**
* Returns an equivalent stream that is sequential. May return * itself, either because the stream was already sequential, or because * the underlying stream state was modified to be sequential. * * <p>This is an <a href="package-summary.html#StreamOps">intermediate
* operation</a>.
* * @return a sequential stream
*/
S sequential();
만약 stream이 병렬로 설정되어있다면 이를 해제하여 stream을 다시 돌려준다.
/**
* Returns an equivalent stream that is parallel. May return * itself, either because the stream was already parallel, or because * the underlying stream state was modified to be parallel. * * <p>This is an <a href="package-summary.html#StreamOps">intermediate
* operation</a>.
* * @return a parallel stream
*/
S parallel();
sequential()과 반대로 해당 stream이 병렬로 설정되어있지 않다면 병렬로 설정하여 stream을 돌려준다.
/**
* Returns an equivalent stream that is * <a href="package-summary.html#Ordering">unordered</a>. May return
* itself, either because the stream was already unordered, or because * the underlying stream state was modified to be unordered. * * <p>This is an <a href="package-summary.html#StreamOps">intermediate
* operation</a>.
* * @return an unordered stream
*/
S unordered();
스트림의 구성요소들의 순서를 해제하는 기능이다. array나 list는 순서가 있다. 하지만 hashset는 순서가 없다. stream에서는 병렬처리를 진행할 경때 순서가 없는 상태인경우 더 나은 성능을 보여준다.
/**
* Returns an equivalent stream with an additional close handler. Close * handlers are run when the {@link #close()} method
* is called on the stream, and are executed in the order they were * added. All close handlers are run, even if earlier close handlers throw * exceptions. If any close handler throws an exception, the first * exception thrown will be relayed to the caller of {@code close()}, with
* any remaining exceptions added to that exception as suppressed exceptions * (unless one of the remaining exceptions is the same exception as the * first exception, since an exception cannot suppress itself.) May * return itself. * * <p>This is an <a href="package-summary.html#StreamOps">intermediate
* operation</a>.
* * @param closeHandler A task to execute when the stream is closed
* @return a stream with a handler that is run if the stream is closed
*/
S onClose(Runnable closeHandler);
스트림에 파라미터로 전달받은 closeHandler를 추가해주는 기능이다.
/**
* Closes this stream, causing all close handlers for this stream pipeline * to be called. * * @see AutoCloseable#close()
*/@Override
void close();
stream을 종료하는 함수이다.
댓글
댓글 쓰기