public interface Spliterator<T> {
boolean tryAdvance(Consumer<T> action);
default void forEachRemaining(Consumer<T> action);
Spliterator<T> trySplit();
long estimateSize();
int characteristics();
}
Stream 안에서만 사용되는 것으로 원소를 순회하고 분할하기 위한 인터페이스이다.
tryAdvance
-spliterator의 원소를 consume할 때 사용된다.
-처리할 요소가 있으면 true를 리턴하고, 모든 요소들이 처리되고 없으면 false를 리턴한다.
forEachRemaining
-더 이상 split이 필요하지 않을 때 특정 action을 하기 위한 메서드이다.
-반복적으로 tryAdvance를 호출하여 spliterator의 원소를 sequential 하게 처리한다.
default void forEachRemaining(Consumer<T> action) {
do {
} while (tryAdvance(action));
}
trySplit
-일부 요소를 두 개의 spliterator로 쪼개서 병렬적으로 두 개의 spliterator를 실행할 수 있도록 한다.
-spliterator는 반복적으로 null을 리턴하지 않고, split 프로세스가 끝나기 전까지 trySplit()을 호출한다.
estimateSize
-spliterator에서 처리할 수 있는 요소의 추정치를 반환한다. trySplit()를 호출하기 전에 크기를 확인하기 위해 AbstractTask와 같은 일부 forkjoin 작업에 의해 호출된다.
*병렬 스트림은 포크조인풀과 Spliterator를 이용하여 동시에 원소를 처리한다. sequential한 처리의 실행시간과 비교 후에 병렬 스트림을 사용하도록 하자.
List<String> name = new ArrayList<>();
name.add("hong");
name.add("whiteship");
name.add("toby");
name.add("foo");
name.forEach(System.out::println);
List<String> name = new ArrayList<>();
name.add("hong");
name.add("whiteship");
name.add("toby");
name.add("foo");
name.removeIf(s -> s.startsWith("h")); // h로 시작하는 문자열이 있는 리스트 제거
name.forEach(System.out::println);
*참고 자료
백기선 - 더 자바, Java 8
https://applefarm.tistory.com/154