function.apply-method在自定义接口中不被覆盖时做什么?

vcirk6k6  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(574)

在下面的示例代码中,我很难理解“apply”方法的用法。apply方法到底在做什么,因为它没有被覆盖?很明显是在返回结果 ValidationResult ,但没有代码支持它。

  1. public class Main {
  2. public static void main(String[] args) {
  3. Customer customer = new Customer("Alice", "alice@gmail.com", "0879546451", LocalDate.of(2000, 1, 1));
  4. ValidationResult result = CustomerRegistrationValidator
  5. .isEmailValid()
  6. .and(CustomerRegistrationValidator.isPhoneNumber())
  7. .and(CustomerRegistrationValidator.isAdult())
  8. .apply(customer);
  9. System.out.println(result);
  10. }
  11. }
  12. public interface CustomerRegistrationValidator extends Function<Customer, ValidationResult> {
  13. static CustomerRegistrationValidator isEmailValid() {
  14. return customer -> customer.getEmail().contains("@") ? ValidationResult.SUCCESS : ValidationResult.EMAIL_NOT_VALID;
  15. }
  16. static CustomerRegistrationValidator isPhoneNumber() {
  17. return customer -> customer.getPhoneNumber().contains("+08") ? ValidationResult.SUCCESS : ValidationResult.PHONE_NUMER_NOT_VALID;
  18. }
  19. static CustomerRegistrationValidator isAdult() {
  20. return customer -> Period.between(customer.getDob(), LocalDate.now()).getYears() > 16 ? ValidationResult.SUCCESS : ValidationResult.IS_NOT_AN_ADULT;
  21. }
  22. default CustomerRegistrationValidator and (CustomerRegistrationValidator other) {
  23. return customer -> {
  24. ValidationResult result = this.apply(customer);
  25. return result.equals(ValidationResult.SUCCESS) ? other.apply(customer) : result;
  26. };
  27. }
  28. enum ValidationResult {
  29. SUCCESS, PHONE_NUMER_NOT_VALID, EMAIL_NOT_VALID, IS_NOT_AN_ADULT;
  30. }
  31. }
wqnecbli

wqnecbli1#

apply方法到底在做什么,因为它没有被覆盖?
取决于所选接口的静态方法。万一 isEmailValid 的身体 apply 方法是

  1. customer.getEmail().contains("@") ? ValidationResult.SUCCESS : ValidationResult.EMAIL_NOT_VALID;

它显然返回了结果validationresult,但是没有代码支持它。
就在那里,一个 CustomerRegistrationValidator 示例由lambda定义。
想象一下你不得不重写这个

  1. static CustomerRegistrationValidator isEmailValid() {
  2. return new CustomerRegistrationValidator() {
  3. @Override
  4. public ValidationResult apply(Customer customer) {
  5. return customer.getEmail().contains("@") ? ValidationResult.SUCCESS : ValidationResult.EMAIL_NOT_VALID;
  6. }
  7. };
  8. }

到lambda语法。你会得到你现在所拥有的。

展开查看全部

相关问题