UFO ET IT

어떤 종류의 목록

ufoet 2020. 12. 4. 21:31
반응형

어떤 종류의 목록 Collectors.toList () 반환합니까?


State of the Lambda : Libraries Edition을 읽고 있는데 한 가지 진술에 놀랐습니다.

Streams 섹션 아래에 다음이 있습니다.

List<Shape> blue = shapes.stream()
                         .filter(s -> s.getColor() == BLUE)
                         .collect(Collectors.toList());

이 문서에는 shapes실제 내용이 나와 있지 않으며 그게 중요한지도 모르겠습니다.

저를 혼란스럽게하는 것은 다음과 같습니다. List이 코드 블록이 어떤 종류의 구체적으로 반환합니까?

  • 변수를에 할당합니다 List<Shape>. 이것은 완전히 괜찮습니다.
  • stream()filter()어떤 종류의 목록을 사용할지 결정 하지도 않습니다 .
  • Collectors.toList()어느 것도의 구체적인 유형을 지정하지 않습니다 List.

그렇다면 여기서 사용되는 구체적인 유형 (하위 클래스)은 List무엇입니까? 보증이 있습니까?


그렇다면 여기서 사용되는 List의 구체적인 유형 (하위 클래스)은 무엇입니까? 보증이 있습니까?

당신의 문서를 보면 Collectors#toList()-, 그 상태 "유형, 가변성, 직렬화, 또는 목록의 스레드 안전성 반환에 대한 보장이 없습니다" . 특정 구현을 반환하려면 Collectors#toCollection(Supplier)대신 사용할 수 있습니다 .

Supplier<List<Shape>> supplier = () -> new LinkedList<Shape>();

List<Shape> blue = shapes.stream()
            .filter(s -> s.getColor() == BLUE)
            .collect(Collectors.toCollection(supplier));

그리고 람다에서 원하는 구현을 반환 할 수 있습니다 List<Shape>.

업데이트 :

또는 메서드 참조를 사용할 수도 있습니다.

List<Shape> blue = shapes.stream()
            .filter(s -> s.getColor() == BLUE)
            .collect(Collectors.toCollection(LinkedList::new));

Netbeans (Ctrl + Click)를 탐색하면서이 코드를 작성했습니다. 공급자로 ArrayList를 사용하는 것 같습니다.

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

그것은 중요하지 않지만 실제로 모든 유형이 런타임에 제네릭이 아니기 때문에 구체적인 유형은 제네릭이 아닙니다.

그렇다면 여기서 사용되는 List의 구체적인 유형 (하위 클래스)은 무엇입니까? 보증이 있습니까?

나는 그렇게 생각하지 않지만 ArrayList 또는 LinkedList는 가능성이 있습니다.

참고 URL : https://stackoverflow.com/questions/21912314/what-kind-of-liste-does-collectors-tolist-return

반응형