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>
Collectors.toList()
dans ce cas renvoie un ArrayList<Integer>
" Il peut ne pas retourner un ArrayList
. 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 de ArrayList
ou List
- il renvoie un Collector
, ce qui finira par créer et retournera List
- é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
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.