Stream
, Optional
등의 인터페이스와 연동해 깨끗한 코드를 만들 수 있다. Function<T,U>
: 하나의 아규먼트, 하나의 결과BiFunction<T,U,R>
: 두개의 아규먼트, 하나의 결과apply
메소드로 아규먼트를 적용한다.andThen
을 활용하여 연결하여 사용할 수 있다.Consumer<T>
: 함수와 다르게 하나의 아규먼트를 갖고, 결과반환(리턴타입이 없다)을 하지 않는다.accept
메소드로 아규먼트를 적용한다.Predicate<T>
: 하나의 아규먼트, Boolean 타입의 결과.test
메소드로 아규먼트를 적용한다.and
메소드로 Predicate
끼리 연결하여 사용할 수 있다.Supplier<T>
: 아규먼트 없음. 하나의 결과filter
, map
등 컬렉션 가공에 필요한 유용한 메소드들을 제공한다.Function<체크대상객체, 유효성체크결과> 를 상속한 인터페이스를 구현한다.
유효성 체크결과는 enum으로 구현
체크대상객체의 유효성을 체크하는 static 메소드들을 생성한다.
각메소드를 연결하는 default method를 구현한다. 예제에서는 현재 유효성 체크가 True 일 경우
인자로 받은 유효성 체크를 연결시키는 형태로 구현하였다.
public interface CustomerRegistrationValidator
extends Function<Customer, ValidationResult> {
static CustomerRegistrationValidator isEmailValid() {
return customer -> customer.getEmail().contains("@") ?
SUCCESS : EMAIL_NOT_VALID;
}
static CustomerRegistrationValidator isPhoneNumberValid() {
return customer -> customer.getPhoneNumber().startsWith("+0") ?
SUCCESS : PHONE_NUMBER_NOT_VALID;
}
static CustomerRegistrationValidator isAnAdult() {
return customer -> Period.between(customer.getDob(), LocalDate.now()).getYears() > 16 ?
SUCCESS : IS_NOT_AN_ADULT;
}
default CustomerRegistrationValidator and (CustomerRegistrationValidator other) {
return customer -> {
ValidationResult result = this.apply(customer);
return result.equals(SUCCESS) ? other.apply(customer) : result;
};
}
enum ValidationResult {
SUCCESS,
PHONE_NUMBER_NOT_VALID,
EMAIL_NOT_VALID,
IS_NOT_AN_ADULT
}
}
() -> {}
로 구성https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/function/package-summary.html