[java] 이 Java 8 Stream collect () 메소드를 이해하는 방법은 무엇입니까?
int 배열을 List로 변환하려고했지만 Java 8 Stream을 사용하는 익숙하지 않은 경로를 사용하여이를 생각해 냈습니다.
Arrays.stream(arr).boxed().collect(Collectors.toList());
나는 아직도이 선을 완전히 이해하는데 어려움을 겪고있다.
-
Collectors.toList()
이 경우ArrayList<Integer>
구현List
인터페이스를 반환하는 이유는 무엇 입니까? 인터페이스를LinkedList<Integer>
준수하는 다른 일반 클래스가 아닌 이유는 무엇List
입니까? 나는 이것에 대해 아무것도 찾을 ArrayList를 언급하는 간단한을 제외 할 수없는 여기 API를 참고 섹션에서. -
왼쪽 패널의
의미는 무엇입니까? 분명히 일반적인 반환 유형입니다 ( 여기의 코드에서는). 그리고 메소드의 일반적인 유형 인수 라고 생각 하지만 어떻게 지정됩니까? Collector 인터페이스 문서를 살펴본 결과 흡수 할 수 없었습니다.Stream.collect()
R
ArrayList<Integer>
<R, A>
답변
-
기본 구현입니다.
ArrayList
대부분의 사용 사례에서 가장 적합하기 때문에 사용되지만 적합하지 않은 경우 언제든지 자신 만의 수집기를 정의하고Collection
원하는 공장을 제공 할 수 있습니다 .Arrays.stream(arr).boxed().collect(toCollection(LinkedList::new));
-
예,
A
및R
이 방법의 일반적인 파라미터이고,R
상기 리턴 형이며,T
상기 입력 유형 및A
요소를 수집하는 전 과정에 표시가 (표시되지 않을 수 있으며이 기능은 문제가되지 않는다) 것으로, 중간 형이다. 의 javadoc 시작 부분Collector
은 해당 유형을 정의합니다 (전체 문서에서 일관됩니다).T-축소 연산에
대한 입력 요소 유형 A- 축소 연산 의 가변 누적 유형 (종종 구현 세부 사항으로 숨겨 짐)
R-축소 연산의 결과 유형
답변
- 이 경우 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);
}
- 왼쪽 패널의
<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);