3
votes

Pourquoi ne puis-je pas utiliser LinkedList :: new?

Disons que j'ai un HashMap comme Map > map = new HashMap <> (); .

Maintenant List values ​​= computeIfAbsent (key, ArrayList :: new); fonctionne parfaitement mais List values ​​= computeIfAbsent (key, LinkedList :: new); < / code> renvoie une erreur de compilation.

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?


2 commentaires

"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. *;


3 Réponses :


7
votes

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 .


1 commentaires

@AmitBera True. Mis à jour. Merci



0
votes

Utilisez la commande suivante

List<Integer> values = map.computeIfAbsent(key, x -> new ArrayList<>());


1 commentaires

Ce serait une meilleure réponse si vous expliquiez pourquoi.



3
votes

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 .


1 commentaires

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.