J'essayais de convertir un tableau int en List et j'ai pris la voie inconnue de l'utilisation de Java 8 Stream et j'ai trouvé cela
Arrays.stream(arr).boxed().collect(Collectors.toList());
J'ai encore du mal à bien comprendre cette ligne, surtout,
Pourquoi
Collectors.toList()
dans ce cas retourne une interface d'ArrayList<Integer>
implémentationList
? Pourquoi pasLinkedList<Integer>
ou toute autre classe générique conforme à l'List
interface? Je ne trouve rien à ce sujet, à l'exception d'une brève mention d'ArrayList ici , dans la section Notes d'API.Que signifie le panneau de gauche ? C'est évidemment le type de retour générique ( dans mon code ici). Et je pense que c'est l'argument de type générique de la méthode, mais comment sont-ils spécifiés? J'ai regardé dans le document d'interface Collector et je n'ai pas pu l'absorber.
Stream.collect()
R
ArrayList<Integer>
<R, A>
R
est le type générique du type résultant.A
le type générique du type d'accumulation intermédiaire du collecteur. C'est le détail de l'implémentation du fonctionnement d'un collecteur. Il divise et conquiert, également pour le traitement parallèle, recueille d'abord en types intermédiaires.Collectors.toList()
dans ce cas renvoie unArrayList<Integer>
" Il peut ne pas retourner unArrayList
. L'List
implémentation n'est pas définie , vous ne pouvez donc pas vous fier à l'implémentation qu'elle renvoie. Comme le dit le javadoc : "Il n'y a aucune garantie sur le type , la mutabilité, la sérialisation ou la sécurité des threads de la liste renvoyée;"toList()
ne renvoie pas deArrayList
ouList
- il renvoie unCollector
, ce qui finira par créer et retourneraList
- également la documentation indique: "... Il n'y a aucune garantie sur le type , la mutabilité, la sérialisation ou la sécurité des threads de la liste retournée; si plus de contrôle sur la liste retournée est nécessaire, utilisez toCollection (Supplier) .... "Réponses:
C'est une implémentation par défaut.
ArrayList
est utilisé, car il est préférable dans la plupart des cas d'utilisation, mais s'il ne vous convient pas, vous pouvez toujours définir votre propre collecteur et fournir l'usine queCollection
vous souhaitez:Oui,
A
etR
sont des paramètres génériques de cette méthode,R
est le type de retour,T
est le type d'entrée etA
est un type intermédiaire, qui apparaît dans l'ensemble du processus de collecte des éléments (peut ne pas être visible et ne concerne pas cette fonction). Le début deCollector
javadoc définit ces types (ils sont cohérents sur l'ensemble du document):la source
List<Integer> myList = Arrays.stream(arr).boxed().collect(Collectors.toList());
et appeler uniquement les méthodes déclarées dans l'interface List sur myList. Sinon, je me mettrais potentiellement en danger, si Oracle décide de changer l'implémentation par défaut dans Java8u1024 ou 15?List
, donc quelle que soit l'implémentation utilisée, le comportement est le même. Il est peu probable que l'interface soit modifiée dans les nouvelles versions de java.Comme la définition de la méthode le suggère, elle renvoie une implémentation Collector avec le fournisseur collector as
ArrayList
. Par conséquent, il est très clair d'après la définition de la méthode ci-dessous quiCollectors.toList
retourne toujours ArrayList collector (While it's arguable why toList not toArrayList word is used in method name
).<R, A> R collect(Collector<? super T, A, R> collector)
moyensSi vous vous référez aux commentaires de documentation, il mentionne avec précision quels sont ces types génériques:
la source
Collectors.toList()
(premier extrait)? Est-ce openjdk?