다음 코드가 있다고 가정합니다.
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"두 번째 호출 에서 메시지가 정확히 한 번만 표시됩니다 computeIfAbsent. 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인스턴스 방법이다.