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 computeIfAbsentya existe un valor para esa clave. En kla 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 ko key). O escribir como whoLetDogsOut.computeIfAbsent("snoop", MyClass::tryToLetOut);si tryToLetOutes statico whoLetDogsOut.computeIfAbsent("snoop", this::tryToLetOut);si tryToLetOutes un método de instancia.