Suponga que tiene el siguiente código:
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class Test {
public static void main(String[] s) {
Map<String, Boolean> whoLetDogsOut = new ConcurrentHashMap<>();
whoLetDogsOut.computeIfAbsent("snoop", k -> f(k));
whoLetDogsOut.computeIfAbsent("snoop", k -> f(k));
}
static boolean f(String s) {
System.out.println("creating a value for \""+s+'"');
return s.isEmpty();
}
}
Luego verá el mensaje creating a value for "snoop"
exactamente una vez, ya que en la segunda invocación computeIfAbsent
ya existe un valor para esa clave. En k
la expresión lambda k -> f(k)
es solo un marcador de posición (parámetro) para la clave que el mapa pasará a su lambda para calcular el valor. Entonces, en el ejemplo, la clave se pasa a la invocación de la función.
Alternativamente, podría escribir: whoLetDogsOut.computeIfAbsent("snoop", k -> k.isEmpty());
para lograr el mismo resultado sin un método auxiliar (pero no verá la salida de depuración entonces). Y aún más simple, ya que es una simple delegación a un método existente que podría escribir: whoLetDogsOut.computeIfAbsent("snoop", String::isEmpty);
esta delegación no necesita ningún parámetro para ser escrito.
Para estar más cerca del ejemplo de su pregunta, puede escribirlo como whoLetDogsOut.computeIfAbsent("snoop", key -> tryToLetOut(key));
(no importa si nombra el parámetro k
o key
). O escribir como whoLetDogsOut.computeIfAbsent("snoop", MyClass::tryToLetOut);
si tryToLetOut
es static
o whoLetDogsOut.computeIfAbsent("snoop", this::tryToLetOut);
si tryToLetOut
es un método de instancia.