source

Java 8에서의 스플리터, 수집기 및 스트림에 대해서

factcode 2023. 1. 15. 17:15
반응형

Java 8에서의 스플리터, 수집기 및 스트림에 대해서

Java 8의 인터페이스, 특히 및 인터페이스와 관련된 인터페이스를 이해하는 데 문제가 있습니다.내 문제는 내가 그저 이해할 수 없다는 것이다.SpliteratorCollector 「 」, 「 」, 「 」, 「 」,Stream이치노

죠?Spliterator a. a. a.CollectorSpliterator ★★★★★★★★★★★★★★★★★」Collector 내 것 같아)Stream그과과))))???????

웹에 흩어져 있는 예시를 읽었지만, 여기의 모든 것은 아직 새롭고 변경될 수 있기 때문에 예시와 튜토리얼은 여전히 매우 희박합니다.

.Spliterator 「아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 맞다Collection사용자가 직접 입력하고 병렬화된 작업을 최적화하려고 합니다.

는 몰라도Spliterator는 컬렉션의 일부분을 쉽게 분할할 수 있도록 하는 방법입니다.예를 들어 병렬화 중이고 한 스레드는 컬렉션의 한 부분에서 작업하고 한 스레드는 다른 부분에서 작업해야 하기 때문입니다.

으로는 절대 것이 좋습니다.Stream이치노 Stream의 ★★★★★★★★★★★★★★★★.Iterator자바독의 예시와 같이 거의 항상 유창 체인으로 사용하는 일회성 객체입니다.

int sum = widgets.stream()
                  .filter(w -> w.getColor() == RED)
                  .mapToInt(w -> w.getWeight())
                  .sum();

Collector는 맵 또는 맵에서 가능한 가장 일반적이고 추상적인 버전의 "솔루션" 연산입니다.특히 병렬화 및 최종화 단계를 지원해야 합니다.의 예Collector에는 다음이 포함됩니다

  • 계, ::Collectors.reducing(0, (x, y) -> x + y)
  • Builder String Builder)Collector.of(StringBuilder::new, StringBuilder::append, StringBuilder::append, StringBuilder::toString)

Spliterator기본적으로 "분할 반복기"를 의미합니다.

통과할 수 에는 스플리테이터의 .trySplit()그러면 다른 사용자(일반적으로 다른 스레드)가 처리할 섹션이 "분리"되어 현재 스플리터 작업이 줄어듭니다.

Collector의 사양을 조합하다reduce(지도 감소에 대한) 함수, 초기값 및 두 결과를 결합하는 함수(따라서 분할된 작업 스트림의 결과를 결합할 수 있습니다.)

예를 들어 가장 기본적인 수집기는 초기값이 0이고 기존 결과에 정수를 추가한 후 두 결과를 추가하여 '결합'합니다.즉, 분할된 정수의 흐름을 합한 것입니다.

참조:

다음은 사전 정의된 수집기를 사용하여 일반적인 가변 감소 태스크를 수행하는 예입니다.

 // Accumulate names into a List
 List<String> list = people.stream().map(Person::getName).collect(Collectors.toList());

 // Accumulate names into a TreeSet
 Set<String> set = people.stream().map(Person::getName).collect(Collectors.toCollection(TreeSet::new));

 // Convert elements to strings and concatenate them, separated by commas
 String joined = things.stream()
                       .map(Object::toString)
                       .collect(Collectors.joining(", "));

 // Compute sum of salaries of employee
 int total = employees.stream()
                      .collect(Collectors.summingInt(Employee::getSalary)));

 // Group employees by department
 Map<Department, List<Employee>> byDept
     = employees.stream()
                .collect(Collectors.groupingBy(Employee::getDepartment));

 // Compute sum of salaries by department
 Map<Department, Integer> totalByDept
     = employees.stream()
                .collect(Collectors.groupingBy(Employee::getDepartment,
                                               Collectors.summingInt(Employee::getSalary)));

 // Partition students into passing and failing
 Map<Boolean, List<Student>> passingFailing =
     students.stream()
             .collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD));

인터페이스 - 스트림의 핵심 기능입니다.

및 디폴트 방식이 인터페이스에 표시됩니다.이러한 메서드는 에 대한 콜을 통해 스플리테이터를 사용합니다.spliterator():

...

default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
}

default Stream<E> parallelStream() {
    return StreamSupport.stream(spliterator(), true);
}

...

스플리터(Spliterator)는 스트림을 작은 부분으로 분할하는 내부 반복기입니다.이 작은 부품들은 병렬로 가공할 수 있다.

다른 방법 중 스플리테이터를 이해하는 데 가장 중요한 두 가지 방법이 있습니다.

  • boolean tryAdvance(Consumer<? super T> action) 와는 달리 다음 요소를 사용하여 작업을 수행하려고 합니다.작업이 성공적으로 실행되면 메서드가 반환됩니다.true 않으면 를 반환합니다.false즉, 스트림의 뜻입니다 - ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ.

  • Spliterator<T> trySplit() 이 방법을 사용하면 데이터 세트를 하나 또는 다른 기준(파일 크기, 줄 수 등)에 따라 더 작은 여러 세트로 분할할 수 있습니다.

언급URL : https://stackoverflow.com/questions/19235606/understanding-spliterator-collector-and-stream-in-java-8

반응형