[java] 이 Java 8 Stream collect () 메소드를 이해하는 방법은 무엇입니까?

int 배열을 List로 변환하려고했지만 Java 8 Stream을 사용하는 익숙하지 않은 경로를 사용하여이를 생각해 냈습니다.

Arrays.stream(arr).boxed().collect(Collectors.toList());

나는 아직도이 선을 완전히 이해하는데 어려움을 겪고있다.

  1. Collectors.toList()이 경우 ArrayList<Integer>구현 List인터페이스를 반환하는 이유는 무엇 입니까? 인터페이스를 LinkedList<Integer>준수하는 다른 일반 클래스가 아닌 이유는 무엇 List입니까? 나는 이것에 대해 아무것도 찾을 ArrayList를 언급하는 간단한을 제외 할 수없는 여기 API를 참고 섹션에서.

  2. 왼쪽 패널의
    의미는 무엇입니까? 분명히 일반적인 반환 유형입니다 ( 여기의 코드에서는). 그리고 메소드의 일반적인 유형 인수 라고 생각 하지만 어떻게 지정됩니까? Collector 인터페이스 문서를 살펴본 결과 흡수 할 수 없었습니다.여기에 이미지 설명을 입력하십시오 Stream.collect()RArrayList<Integer><R, A>



답변

  1. 기본 구현입니다. ArrayList대부분의 사용 사례에서 가장 적합하기 때문에 사용되지만 적합하지 않은 경우 언제든지 자신 만의 수집기를 정의하고 Collection원하는 공장을 제공 할 수 있습니다 .

    Arrays.stream(arr).boxed().collect(toCollection(LinkedList::new));
  2. 예, AR이 방법의 일반적인 파라미터이고, R상기 리턴 형이며, T상기 입력 유형 및 A요소를 수집하는 전 과정에 표시가 (표시되지 않을 수 있으며이 기능은 문제가되지 않는다) 것으로, 중간 형이다. 의 javadoc 시작 부분Collector 은 해당 유형을 정의합니다 (전체 문서에서 일관됩니다).

    T-축소 연산에
    대한 입력 요소 유형 A- 축소 연산 의 가변 누적 유형 (종종 구현 세부 사항으로 숨겨 짐)
    R-축소 연산의 결과 유형


답변

  1. 이 경우 Collectors.toList ()가 List 인터페이스를 구현하는 ArrayList를 리턴하는 이유는 무엇입니까?

메소드 정의에서 알 수 있듯이 콜렉터 공급자를로 사용하여 콜렉터 구현을 리턴합니다 ArrayList. 따라서 아래의 메소드 정의에서 Collectors.toList항상 ArrayList collector ( While it's arguable why toList not toArrayList word is used in method name)를 반환 하는 것이 분명 합니다 .

public static <T>
    Collector<T, ?, List<T>> toList() {
        return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,
                                   (left, right) -> { left.addAll(right); return left; },
                                   CH_ID);
    }
  1. 왼쪽 패널의 <R, A> R collect(Collector<? super T, A, R> collector)의미 는 무엇입니까

문서 주석을 참조하면 이러한 일반 유형이 무엇인지 정확하게 언급합니다.

/*
      @param <R> the type of the result
      @param <A> the intermediate accumulation type of the {@code Collector}
      @param collector the {@code Collector} describing the reduction
      @return the result of the reduction
*/
 <R, A> R collect(Collector<? super T, A, R> collector);


답변