Supplier<T>
T타입의 값을 제공하는 함수 인터페이스이다. T타입의 값을 제공 받고 리턴도 하지 않아 이 인터페이스가 왜 필요한지 의문이 들 수 있는데 주로 Lazy Evaluation에 사용이 된다.
Lazy Evaluation
불필요한 연산을 피하기 위해 연산을 지연시켜놓았다가 필요할 때 연산하는 방법.
예시를 통해 Lazy Evaluation에 대해 알아보자.
1. printState에서는 valid가 true이면 value + word, false이면 wrong world를 출력한다.
public void printState(boolean valid, String value) {
if(valid) {
System.out.println(value + " world");
} else {
System.out.println("wrong world");
}
}
2. printState를 호출할 때 value에 1초를 지연시키고 "vanilla"를 리턴하는 함수를 넘겨준다.
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
printState(true, getName());
printState(false, getName());
printState(false, getName());
System.out.println((System.currentTimeMillis() - startTime) / 1000 + "sec");
}
public static String getName() {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return "Hello ";
}
여기서 인자로 getName()함수를 넘기면 printState는 value의 값을 가지고 있어야 하기 때문에 getName이 호출되고 , value에 "Vanilla"라는 값이 바인딩 된다.
Supplier 적용
이번에는 Supplier를 이용하여 lazy evaluation을 적용해보자. String value로 받던 매개변수를 Supplier로 교체하자.
public void printState(boolean valid, Supplier<String> valueSupplier) {
if(valid) {
System.out.println(value + " world");
} else {
System.out.println("wrong world");
}
}
valueSupplie.get()이 valid일 때만 호출이 되기 때문에 1초만에 출력이 끝나는 것을 확인할 수 있다.