public Funlee findById(long id){ return repo.findById(id).orElseGet(Funlee::new); } }
1 2 3 4
// Optional.class public T orElseGet(Supplier<? extends T> supplier){ returnthis.value != null ? this.value : supplier.get(); }
1 2 3 4 5
// Supplier.java @FunctionalInterface publicinterfaceSupplier<T> { T get(); }
Optional 클래스의 orElseGet 함수의 파라미터는 Supplier를 상속받아 구현한 객체를 받고 있으며 Supplier 클래스는 함수가 하나 뿐인 인터페이스로 @FunctionalInterface 어노테이션이 작성돼 있다. 자바에서는 하나의 함수만 존재하는 인터페이스에 한해서 람다(lambda)로 변경할 수 있도록 지원해주고 있으므로 예제와 같이 Funlee::new와 같은 람다 호출이 가능하다.
만약 람다식으로 호출하지 않는다면 다음과 같이 풀어서 작성할 수 있다.
1 2 3 4 5 6 7 8
public Funlee findById(long id){ return repo.findById(id).orElseGet(new Supplier<Funlee>() { @Override public Funlee get(){ returnnew Funlee(); } } }