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