Как понять этот метод Java 8 Stream collect ()? - PullRequest
10 голосов
/ 04 ноября 2019

Я пытался преобразовать массив int в List, и я выбрал незнакомый путь использования Java 8 Stream и придумал этот

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

Мне все еще трудно полностью понять эту строку, в основном,

  1. Почему Collectors.toList() в этом случае возвращает ArrayList<Integer> реализующий List интерфейс? Почему бы не LinkedList<Integer> или любой другой универсальный класс, соответствующий интерфейсу List? Я ничего не могу найти по этому поводу, за исключением краткого упоминания ArrayList здесь , в разделе API Notes.

  2. Что означает левая панель enter image description here Stream.collect()? Очевидно, R является общим типом возврата (ArrayList<Integer> в моем коде здесь). И я думаю, <R, A> является аргументом общего типа метода, но как они указаны? Я изучил интерфейсный документ Collector и не смог его поглотить.

Ответы [ 2 ]

13 голосов
/ 04 ноября 2019
  1. Это реализация по умолчанию. ArrayList используется, потому что это лучше всего в большинстве случаев, но если это не подходит для вас, вы всегда можете определить свой собственный коллектор и предоставить фабрику для Collection, на ваше усмотрение:

    Arrays.stream(arr).boxed().collect(toCollection(LinkedList::new));
    
  2. Да, A и R - общие параметры этого метода, R - тип возвращаемого значения, T - тип ввода и A - промежуточный тип, который появляется во всем процессе. сбора элементов (может быть не виден и не относится к этой функции). В указанном вами начале javadoc определены эти типы (они согласованы по всему документу):

T - тип элементов ввода для операции сокращения

A - изменяемый тип накопления операции сокращения (часто скрытый как деталь реализации)

R - тип результата операции сокращения

1 голос
/ 04 ноября 2019
  1. Почему Collectors.toList () в этом случае возвращает ArrayList, реализующий интерфейс List?

Поскольку определение метода предполагает, что он возвращает реализацию Collector с коллекторомпоставщик как ArrayList. Следовательно, из определения метода ниже очень ясно, что Collectors.toList всегда возвращает сборщик ArrayList (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);
...