J'essayais de convertir un tableau int en List et j'ai pris la voie inconnue d'utiliser Java 8 Stream et je suis arrivé avec cette
Arrays.stream(arr).boxed().collect(Collectors.toList());
J'ai encore du mal à bien comprendre cette ligne, surtout,
Pourquoi Collectors.toList()
dans ce cas renvoie une interface ArrayList<Integer>
Implémentant List
? Pourquoi pas LinkedList<Integer>
Ou toute autre classe générique conforme à l'interface List
? Je ne trouve rien à ce sujet, à l'exception d'une brève mention d'ArrayList ici , dans la section Notes d'API.
Qu'est-ce que le panneau gauche de Stream.collect()
signifie? Évidemment, R
est le type de retour générique (ArrayList<Integer>
Dans mon code ici). Et je pense que <R, A>
Est l'argument de type générique de la méthode, mais comment sont-ils spécifiés? J'ai regardé Collector interface doc et je n'ai pas pu l'absorber.
Comme la définition de la méthode le suggère, elle renvoie une implémentation de collecteur avec le fournisseur de collecteur sous la forme ArrayList
. Par conséquent, il est très clair d'après la définition de méthode ci-dessous que Collectors.toList
Renvoie toujours le collecteur 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)
Si vous vous référez à des commentaires de documentation, il mentionne précisément quels sont ces types génériques:
/*
@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);