JAVA/Modern JAVA

[JAVA 8] 분할 가능한 Iterator인 Spliterator 인터페이스

빅콜팝 2022. 11. 1. 00:21
728x90
반응형

자바8에서 추가된 쪼갤 수 있는 기능을 가지고 있는 iterator란 뜻으로, Split + Iterator 인 Spliterator 인터페이스는 병렬 작업에 특화되어있다.

즉 Iterator가 반복이라면, Spliterator는 분할 가능한 반복이다.

Iterator

import java.util.*;

public class Solution3 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("콜팝");
        list.add("치킨");
        list.add("곱창");
        list.add("팝콘");
        list.add("피자");

        Iterator<String> listIterator = list.iterator();

        while(listIterator.hasNext()){
            System.out.println(listIterator.next());
        }
    }
}
// result 

콜팝
치킨
곱창
팝콘
피자

Process finished with exit code 0

 

spliterator

import java.util.*;

public class Solution3 {
    public static void main(String[] args) throws InterruptedException {
        List<String> list = new ArrayList<>();
        list.add("콜팝");
        list.add("치킨");
        list.add("곱창");
        list.add("팝콘");
        list.add("피자");

        Spliterator<String> spliterator1 = list.spliterator();
        Spliterator<String> spliterator2 = spliterator1.trySplit();

        // 1. forEach 람다 사용
        spliterator1.forEachRemaining(s -> System.out.println(s));
        System.out.println("====== 구분선 ======");
        spliterator2.forEachRemaining(s -> System.out.println(s));

        // 2. forEach 메소드 사용
        spliterator1.forEachRemaining(System.out::println);
        System.out.println("====== 구분선 ======");
        spliterator2.forEachRemaining(System.out::println);

        // 3. tryAdvance 반복문 사용
        while(spliterator1.tryAdvance(System.out::println));
        System.out.println("====== 구분선 ======");
        while(spliterator2.tryAdvance(System.out::println));
    }
}
// result

곱창
팝콘
피자
====== 구분선 ======
콜팝
치킨

Process finished with exit code 0

 

- 1. 2. 3. 사용 방식은 모두 똑같은 결과를 반환한다.

- spliterator는 순서를 보장하지 않으며, 먼저 저장된 데이터가 분리되는 데이터(spliterator2)로 이동한다.

- 데이터가 홀수인 경우 분리되는 데이터가 하나 더 적게 가져간다.

 

주요 메서드 기능
boolean tryAdvance 원소가 있으면 true, 없으면 false 리턴
Spliterator<T> trySplit 두개의 spliterator로 쪼개 병렬처리가 가능하게함
void forEachRemaining 각 요소에 대해 지정된 작업을 순차적으로 수행
long estimateSize 사이즈 반환(널이면 -1 반환)
int characteristics 특성을 포함하는 int값 반환

 

// TODO 멀티쓰레드 적용

728x90
반응형