Disons que j'ai un HashMap comme Map
.
Maintenant List
fonctionne parfaitement mais List
Je peux voir des constructeurs sans argument dans ArrayList ainsi que LinkedList. Qu'est-ce que je manque ici, quelqu'un peut-il expliquer ce comportement?
3 Réponses :
Ce que vous avez probablement l'intention de faire est de spécifier l'expression lamba pour l'initialisation comme suit:
List<Integer> values = map.computeIfAbsent(key, ArrayList::new);
ou
List<Integer> values = computeIfAbsent(key, LinkedList::new);
La raison , pourquoi le code
List<Integer> values = map.computeIfAbsent(key, a -> new LinkedList<>());
ne compilerait pas est que le constructeur le plus proche de la syntaxe actuelle avec un seul argument attend une Collection étend E> c
au lieu d'un Integer
, il n'a donc pas pu être résolu.
D'autre part, la raison pour laquelle
List<Integer> values = map.computeIfAbsent(key, a -> new ArrayList<>());
compile, il a un constructeur acceptant l'argument int
, mais notez que c'est pour la capacité de la liste .
@AmitBera True. Mis à jour. Merci
Utilisez la commande suivante
List<Integer> values = map.computeIfAbsent(key, x -> new ArrayList<>());
Ce serait une meilleure réponse si vous expliquiez pourquoi.
Le lambda nécessaire doit être de signature Function super K ,? étend V> mappingFunction
, donc quand vous écrivez:
List<Integer> values = map.computeIfAbsent(key, ArrayList::new);
un constructeur avec un argument d'un type compatible avec celui de key
( Un entier
) doit être indiqué. Il y en a un pour ArrayList
mais pas pour LinkedList
:
Constructeurs pour ArrayList
:
ArrayList ()
ArrayList (Collection c)
ArrayList (int initialCapacity)
Constructeurs pour LinkedList
:
LinkedList ()
LinkedList (Collection c)
Faites attention que le fait que cela fonctionne pour ArrayList
n'est probablement pas un bon point car il construit un ArrayList
vide avec une capacité initiale (qui peut conduire à d'étranges effets de bordure).
Vous pouvez vous référer à Référence de méthode en Java .
Il est important de souligner que le constructeur ArrayList (int)
implicitement utilisé dans l'exemple computeIfAbsent (key, ArrayList :: new)
ne fait pas la chose prévue et peut conduire à des OutOfMemoryError
s.
"jette une erreur de compilation", généralement, une erreur d'ensemble de préparation vous donne le premier indice. ça dit quoi?
Êtes-vous import java.util. *;