functional interface 를 이용해서 lazy evaluation 을 활용하자

Supplier

@FunctionalInterface
public interface Supplier<T> {

    T get();
}

Consumer

@FunctionalInterface public interface Consumer {

void accept(T t);

default Consumer<T> andThen(Consumer<? super T> after) {
    Objects.requireNonNull(after);
    return (T t) -> { accept(t); after.accept(t); };
} }

Predicate

@FunctionalInterface
public interface Predicate<T> {

    boolean test(T t);

    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }

    default Predicate<T> negate() {
        return (t) -> !test(t);
    }
    
    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }
    
    static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }
}

메소에서 판단을 기준으로 메서들의 실행이 필요할 때 function 함수로 param을 사용하면 lazy evaluation 이 발생하여 좀 더 효율적인다.