Supposons que vous avez le code suivant:
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class Test {
public static void main(String[] s) {
Map whoLetDogsOut = new ConcurrentHashMap<>();
whoLetDogsOut.computeIfAbsent("snoop", k -> f(k));
whoLetDogsOut.computeIfAbsent("snoop", k -> f(k));
}
static boolean f(String s) {
System.out.println("créer une valeur pour \""+s+'"');
return s.isEmpty();
}
}
Alors vous verrez le message créer une valeur pour "snoop"
exactement une fois car lors de la deuxième invocation de computeIfAbsent
, il y a déjà une valeur pour cette clé. Le k
dans l'expression lambda k -> f(k)
est juste un espace réservé (paramètre) pour la clé que la carte transmettra à votre lambda pour calculer la valeur. Ainsi dans l'exemple, la clé est transmise à l'invocation de la fonction.
Alternativement, vous pourriez écrire: whoLetDogsOut.computeIfAbsent("snoop", k -> k.isEmpty());
pour obtenir le même résultat sans méthode auxiliaire (mais vous ne verrez pas la sortie de débogage alors). Et encore plus simple, comme c'est une simple délégation à une méthode existante, vous pourriez écrire: whoLetDogsOut.computeIfAbsent("snoop", String::isEmpty);
Cette délégation ne nécessite pas d'écrire des paramètres.
Pour être plus proche de l'exemple dans votre question, vous pourriez l'écrire comme ceci: whoLetDogsOut.computeIfAbsent("snoop", clé -> tryToLetOut(clé));
(peu importe que vous nomiez le paramètre k
ou clé
). Ou l'écrire comme whoLetDogsOut.computeIfAbsent("snoop", MyClass::tryToLetOut);
si tryToLetOut
est static
ou whoLetDogsOut.computeIfAbsent("snoop", this::tryToLetOut);
si tryToLetOut
est une méthode d'instance.