자바 8에서 인터페이스(Iterable, Collection, Comparator)에 추가된 기본 메서드, Spliterator 인터페이스

Red Culture·2021년 8월 22일
0

Spliterator 인터페이스

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한 처리의 실행시간과 비교 후에 병렬 스트림을 사용하도록 하자.

Iterable에서 추가된 기본 메서드

  • forEach()
        List<String> name = new ArrayList<>();

        name.add("hong");
        name.add("whiteship");
        name.add("toby");
        name.add("foo");

        name.forEach(System.out::println);
  • spliterator() : 쪼갤 수 있는 기능을 가지고 있는 iterator

Collection 추가된 기본 메서드

  • stream() / parallelStream()
  • removeIf(Predicate)
        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);
  • spliterator()

Comparator 추가된 기본 메서드

  • reversed()
  • thenComparing()
  • static reverseOrder() / naturalOrder()
  • static nullsFirst() / nullsLast()
  • static comparing()

*참고 자료
백기선 - 더 자바, Java 8
https://applefarm.tistory.com/154

profile
자기 개발, 학습 정리를 위한 블로그

0개의 댓글