Spliterator 인터페이스
JAVA/Reference

Spliterator 인터페이스

자바 8은 분할할 수 있는 반복자 'Spliterator'를 제공합니다.

Spliterator 인터페이스는 특정 소스의 객체를 탐색하거나 파티셔닝 하기 위한 인터페이스로 Stream의 파이프라이닝 처리를 위한 핵심적인 역할을 하고 있습니다.

특히 'Iterator'와 비슷한 기능을 하지만 'Spliterator'은 특히 병렬 작업에 특화되었습니다!

크게 4가지 메서드를 보고 가겠습니다.

 

1. boolean tryAdvance(Consumer <? super T> action);

'Spliterator'의 요소를 하나씩 순차적으로 작업을 수행하면서 남아있는 요소가 있으면 참을 아니면 거짓을 반환합니다. 이 Spliterator가 ORDERED(순서가 정해져 있다)면 다음 요소에서 발생 순서대로 작업이 수행됩니다.

 

2. Spliterator <T> trySplit( );

이 Spliterator를 추가적으로 분할할 수 있는 경우 일부 요소를 분할해 반환합니다. 만약 분할 할 수 없다면, null을 반환합니다.

 Spliterator가 ORDERED인 경우 반환된 값이 앞부분이 되고 원 객체가 뒷부분이 됩니다. 반환 된 Spliterator는 요소의 엄격한 접두사를 포함해야 합니다.

 

이 Spliterator가 무한한 수의 요소를 다루지 않는 한 trySplit( ) 반복 된 호출 은 결국 null 을 반환을 합니다.

 

Null이 아닌 리턴시 :

  • 분할 전의 'estimateSize( )'의 값은 분할 후 이 값과 반환된 Spliterator의 'estimateSize( )'보다 크거나 같아야 합니다.     (before.estimateSize( ) >= after.estimateSize( ) or before.trySplit( ). estimateSize)
  • 이 Spliterator가 SUBSIZED 인 경우 , 분할하기 전의 Spliterator 'estimateSize( )'는 분할된 Spliterator의 'estimateSize( )'와 분할 후 리턴된Spliterator의 합과 같아야 합니다.

이 메서드는 데이터 구조 제한 조건 및 효율성 고려 사항을 포함하여 어떤 이유로 든 null 을 리턴할 수 있습니다.

 

3. long estimateSize( );

'forEachRemaining(java.util.function.Consumer <? super T>)' 탐색에서 만날 수 있는 요소 수의 추정치를 반환하거나 , 요소의 추정치가 무한하거나 알 수 없거나 계산하기에 너무 비싸면 'Long.MAX_VALUE' 를 반환반환합니다.

 

이 Spliterator가 'SIZED''SIZED'[각주:1]이고,[/footnote]아직 부분적으로 탐색 또는 분할되지 않았거나 이 Spliterator가 'SUBSIZED'이고 아직 부분적으로 탐색되지 않은 경우, 이 예상은 완전한 탐색에 의해 발생될 요소의 정확한 개수를 파악해야 합니다. 그렇지 않으면이 추정 값이 임의로 부정확할 수 있지만 'trySplit( ') 호출에서 지정된 대로 감소해야 합니다.

 

API 참고 사항

정확하지 않은 추정치라도 종종 유용하고 비용이 적게 드는 경우가 있습니다. 예를 들어, 대략적으로 균형 잡힌 이진트리의 하위 Spliterator는 요소 수를 상위 요소 수의 절반으로 추정하는 값을 반환할 수 있습니다. 루트 Spliterator가 정확한 카운트를 유지하지 않으면 최대 깊이에 해당하는 2의 거듭제곱으로 크기를 추정할 수 있습니다.

 

Returns

    1. 탐색해야 하는 요소 수.

    2. 계산하기에 무한하거나 알 수 없거나 너무 비싼 경우 Long.MAX_VALUE.

 

4. int characteristics( );

'Spliterator' 및 해당 요소의 특성 집합을 포함하는 int를 반환합니다. 이를 통해 'Spliterator'의 제어와 최적화를 더 잘할 수 있습니다. 결과는 'ORDERED', 'DISTINCT', 'SORTED', 'SIZED', 'NONNULL', 'IMMUTABLE', 'CONCURRENT', 'SUBSIZED'의 값으로 표시됩니다. 분할된 'Spliterator'의 'characteristics( )'에 대한 반복 호출은 항상 동일한 결과를 반환해야 합니다.

'Spliterator'가 일관성 없는 특성 집합(단일 호출 또는 여러 호출에서 반환된 특성)을 보고하는 경우 이 'Spliterator'를 사용한 계산에 대해 보장할 수 없습니다.

 

API 참고 사항

분할 전 주어진 'Spliterator'의 특성은 분할 후의 특성과 다를 수 있습니다.

구체적으로는 참조 특성치는 SIZED , SUBSIZED 및 CONCURRENT.

 

Returns

특성의 표현

 

Characteristics 속성

특성 의미
ORDERED 미리 요소에 정해진 순서가 있기 때문에, 요소를 탐색하고 분할할 때 순서에 유의하라.
DISTINCT 'x', 'y' 두 요소를 방문했을 때 'x.equels(y)'의 경우 항상 false를 반환하라. (중복 제거)
SORTED 탐색된 요소는 미리 정의된 정렬 순서를 따른다.
SIZED 크기가 알려진 소스로 'Spliterator'를 생성했기 때문에, 'estimatedSize( )'를 실행할 때 정확한 값을
반환
해라.
NON-NULL 탐색하는 모든 요소는 'null'이 아니다.
IMMUTABLE 'Spliterator'소스는 불변이다. (탐색 동안 요소를 추가, 삭제, 수정이 불가능)
CONCURRENT 동기화 없이 'Spliterator'의 소스를 여러 스레드에서 동시에 고칠 수 있다.
SUBSIZED 루트 'Spliterator'와 분할되는 모든 서브'Spliterator'은 'SIZED' 특성을 가진다.

 

 

Spliterator 동작 과정

그림 1 Spliterator 작동 과정

STEP1

첫 번째 'Spliterator'에 'trySplit( )' 호출 -> 두 번째 'Spliterator' 생성

 

STEP2

두 개의 'Spliterator'에 'trySplit( )' 호출 -> 총 4개의 'Spliterator' 생성 (Null을 반환할 때까지 반복)

 

STEP3

'trySplite( )'가 Null을 반환 (더 이상 분할 불가)

 

STEP4

재귀 분할 과정 종료

 

 

Spliterator (Java Platform SE 8 ) (oracle.com)

 

Spliterator (Java Platform SE 8 )

Characteristic value signifying that the element source may be safely concurrently modified (allowing additions, replacements, and/or removals) by multiple threads without external synchronization. If so, the Spliterator is expected to have a documented po

docs.oracle.com

 

  1. SIZED : 'estimateSize( )'에서 반환된 값이 구조적 소스 수정이 없는 경우 완전 탐색에서 만날 수 있는 요소 수의 정확한 수를 나타내는 특성 값입니다 [본문으로]

'JAVA > Reference' 카테고리의 다른 글

LocalDate  (0) 2021.09.18
Optional  (0) 2021.09.16