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


12

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>


2
1. 그것은 분명히 후드 아래의 실제 목록을 사용합니다. 그러나 API가 실제 기본 목록 유형을 공개하는 것은 현명하지 않습니다. 그 이후로 그들은 더 이상 구현을 변경할 수 없었습니다. 일반적으로 인터페이스 만 노출하고 실제 기본 유형은 노출하지 않는 것이 좋습니다. 2. R결과 유형의 일반 유형입니다. A수집기의 중간 누적 유형의 일반 유형 이는 콜렉터 작동 방식의 구현 세부 사항이며, 병렬 처리를 위해 분할 및 정복을 수행하여 먼저 중간 유형으로 수집합니다.
Zabuzard

10
거의 실제로 LinkedList를 원하지 않습니다 . Josh Bloch의 트윗이 있는데 "내가 쓴 적이 있는데 절대 사용하지 않는다"고 말합니다.
Andy Turner

4
" Collectors.toList()이 경우 왜 ArrayList<Integer>"를 반환합니다 ArrayList. List구현되어 정의되지 않은 당신이 그것을 반환하는 것을 구현에 의존 할 수 있습니다. 는 AS 의 javadoc가 말한다 : "없습니다 유형에 대한 보장 , 가변성, 직렬화, 반품 목록의 스레드 안전;"
Andreas

3
toList()을 반환하지 않습니다 ArrayList또는을List 반환 - Collector결국 생성하고 반환하는하는 List- 또한 문서 상태 : "...에 대한 보장이 없습니다 유형 , 가변성, 직렬화, 또는 목록의 스레드 안전성이 반환; 반환 된 List에 대한 추가 제어가 필요한 경우 toCollection (Supplier) .... "를 사용하십시오.
user85421-Banned

답변:


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

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

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


알 겠어. List<Integer> myList = Arrays.stream(arr).boxed().collect(Collectors.toList());myList의 List 인터페이스에 선언 된 메소드 만 사용하고 호출 해야한다고 생각합니다 . 그렇지 않으면 Oracle이 Java8u1024 또는 15에서 기본 구현을 변경하기로 결정한 경우 잠재적으로 위험에 처할 수 있습니까?
user3207158

2
@ user3207158이 메소드는를 반환 List하므로 어떤 구현을 사용하더라도 동작은 동일합니다. 최신 버전의 Java에서 인터페이스가 변경되지는 않습니다.
Andronicus

1
  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);

감사합니다. Collectors.toList()(첫 번째 스 니펫) 의 소스 코드는 어디서 얻었 습니까? openjdk입니까?
user3207158

1
아니! 내 intelli j
Vinay Prajapati
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.