Open zpqmdh opened 1 week ago
Q.
spliterator
메서드에 대해서 더 자세히 설명해주실 수 있나요?
A.
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Spliterator;
public class SplitTest {
public static void main(String[] args) {
List<String> wordList = new ArrayList<>();
wordList.add("apple");
wordList.add("banana");
wordList.add("grape");
wordList.add("orange");
wordList.add("mango");
wordList.add("watermelon");
Iterator<String> iterator = wordList.iterator();
// 일반적인 Iterator를 통한 순차 처리
System.out.println("기존의 iterator를 사용한 순차 출력");
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
System.out.println("=====");
// trySplit 메서드를 사용하지 않은 상태의 Spliterator 처리
// 순차 처리와 동일하게 동작합니다.
System.out.println("trySplit 을 사용하지 않은 Spliterator 의 출력");
Spliterator<String> spliterator = wordList.spliterator();
// spliterator는 forEachRemaining 메서드를 통해 내부 요소들을 순회하여 처리할 함수를 정의할 수 있습니다.
spliterator.forEachRemaining(System.out::println);
System.out.println("=====");
// trySplit 메서드를 사용한 상태의 Spliterator 처리
// 데이터를 정확히 절반으로 나누어 순차 처리합니다. 이때 순서는 고려되지 않음에 유의합니다.
Spliterator<String> spliterator1 = wordList.spliterator();
Spliterator<String> spliterator2 = spliterator1.trySplit();
System.out.println("Spliterator1의 출력");
spliterator1.forEachRemaining(System.out::println);
System.out.println("=====");
System.out.println("Spliterator2의 출력");
spliterator2.forEachRemaining(System.out::println);
}
}
결과 사진
spliterator는 trySplit() 메서드를 통해 리스트 내부의 값들을 정확히 절반으로 자르려고 하며 요소의 개수가 홀수인 경우 둘 중 하나가 더 많은 수의 요소를 가지게 됩니다.
만약 trySplit() 메서드를 한 번도 사용하지 않을 시에는 일반적인 iterator처럼 동작하게 됩니다.
이렇게 구간을 통해 나누게 되면 이후 멀티스레드에서 각 구간에 대해 병렬 처리가 가능하게 되므로 멀티스레드를 사용한 프로그램에서는 이런 spliterator의 존재 여부에 따라 성능이 달라질 수 있습니다.
따라서 만약 저희가 커스터마이징한 Stream 또는 Iterable, Collection 타입 하위 클래스에 대해 요소를 병렬적으로 처리하기 위해서는 이런 병렬 처리를 하는데 있어 도와주는 Spliterator 인터페이스가 필요하게 됩니다.
이러한 이유로 저희가 커스터마이징한 Stream, Collection, Iterable 타입에 맞는 spliterator 메서드를 반드시 재정의 해야 합니다.
더 상세한 정보는 해당 링크를 참고해 주시면 될 것 같습니다.
라는 내용이 있는데
spliterator
메서드에 대해서 더 자세히 설명해주실 수 있나요?