次のコードがあるとします。
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();
}
}
次にcreating a value for "snoop"
、2回目の呼び出し時と同じように、computeIfAbsent
そのキーの値がすでにあるので、メッセージが1回だけ表示されます。k
ラムダ式ではk -> f(k)
ちょうどマップが値を計算するために、あなたのラムダに渡すキーのplaceolder(パラメータ)です。したがって、この例では、キーは関数呼び出しに渡されます。
または、次のように書くこともできます。whoLetDogsOut.computeIfAbsent("snoop", k -> k.isEmpty());
ヘルパーメソッドなしで同じ結果を得るには(ただし、デバッグ出力は表示されません)。また、既存のメソッドへの単純な委譲であるため、さらに簡単に記述できます。whoLetDogsOut.computeIfAbsent("snoop", String::isEmpty);
この委任では、パラメータを記述する必要はありません。
近い例にあなたの質問にあるように、あなたはそれを書くことができるwhoLetDogsOut.computeIfAbsent("snoop", key -> tryToLetOut(key));
(あなたが、パラメータに名前を付けるかどうかは関係ありませんk
かkey
)。それともとしてそれを書くwhoLetDogsOut.computeIfAbsent("snoop", MyClass::tryToLetOut);
場合tryToLetOut
であるstatic
かwhoLetDogsOut.computeIfAbsent("snoop", this::tryToLetOut);
場合は、tryToLetOut
インスタンスメソッドです。