Java 当Function.apply-Method';它没有被覆盖吗?

Java 当Function.apply-Method';它没有被覆盖吗?,java,interface,functional-programming,functional-interface,Java,Interface,Functional Programming,Functional Interface,在下面的示例代码中,我很难理解“apply”方法的用法。apply方法到底在做什么,因为它没有被覆盖? 它显然返回了结果ValidationResult,但是没有代码支持它 public class Main { public static void main(String[] args) { Customer customer = new Customer("Alice", "alice@gmail.com",

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

public class Main {

    public static void main(String[] args) {
        
        Customer customer = new Customer("Alice", "alice@gmail.com", "0879546451", LocalDate.of(2000, 1, 1));
                
        ValidationResult result = CustomerRegistrationValidator
        .isEmailValid()
        .and(CustomerRegistrationValidator.isPhoneNumber())
        .and(CustomerRegistrationValidator.isAdult())
        .apply(customer);
        
        System.out.println(result);
    }
}

public interface CustomerRegistrationValidator extends Function<Customer, ValidationResult> {
    
    static CustomerRegistrationValidator isEmailValid() {
        return customer -> customer.getEmail().contains("@") ? ValidationResult.SUCCESS : ValidationResult.EMAIL_NOT_VALID;
    }
    
    static CustomerRegistrationValidator isPhoneNumber() {
        return customer -> customer.getPhoneNumber().contains("+08") ? ValidationResult.SUCCESS : ValidationResult.PHONE_NUMER_NOT_VALID;
    }
    
    static CustomerRegistrationValidator isAdult() {
        return customer -> Period.between(customer.getDob(), LocalDate.now()).getYears() > 16 ? ValidationResult.SUCCESS : ValidationResult.IS_NOT_AN_ADULT;
    }
    
    default CustomerRegistrationValidator and (CustomerRegistrationValidator other) {
        return customer -> {
            ValidationResult result = this.apply(customer);
            return result.equals(ValidationResult.SUCCESS) ? other.apply(customer) : result;
        };
    }
    
    enum ValidationResult {
        SUCCESS, PHONE_NUMER_NOT_VALID, EMAIL_NOT_VALID, IS_NOT_AN_ADULT;
    } 
}
公共类主{
公共静态void main(字符串[]args){
客户=新客户(“Alice”alice@gmail.com“,“0879546451”,本地日期(2000年1月1日);
ValidationResult=CustomerRegistrationValidator
.isEmailValid()
.和(CustomerRegistrationValidator.isPhoneNumber())
.和(CustomerRegistrationValidator.isadalt())
.申请(客户);
系统输出打印项次(结果);
}
}
公共接口CustomerRegistrationValidator扩展函数{
静态CustomerRegistrationValidator isEmailValid(){
return customer->customer.getEmail()包含(“@”)?ValidationResult.SUCCESS:ValidationResult.EMAIL\u无效;
}
静态CustomerRegistrationValidator isPhoneNumber(){
return customer->customer.getPhoneNumber()包含(“+08”)?ValidationResult.SUCCESS:ValidationResult.PHONE\u NUMER\u无效;
}
静态CustomerRegistrationValidator isAdult(){
return customer->Period.between(customer.getDob(),LocalDate.now()).getYears()>16?ValidationResult.SUCCESS:ValidationResult.IS不是成年人;
}
默认CustomerRegistrationValidator和(CustomerRegistrationValidator其他){
退货客户->{
ValidationResult=this.apply(客户);
返回result.equals(ValidationResult.SUCCESS)?other.apply(customer):结果;
};
}
枚举验证结果{
成功,电话号码无效,电子邮件无效,不是成年人;
} 
}
apply方法到底在做什么,因为它没有被覆盖

取决于所选接口的静态方法。如果
isEmailValid
,则
apply
方法的主体为

customer.getEmail().contains("@") ? ValidationResult.SUCCESS : ValidationResult.EMAIL_NOT_VALID;
它显然返回了结果ValidationResult,但是没有代码支持它

public class Main {

    public static void main(String[] args) {
        
        Customer customer = new Customer("Alice", "alice@gmail.com", "0879546451", LocalDate.of(2000, 1, 1));
                
        ValidationResult result = CustomerRegistrationValidator
        .isEmailValid()
        .and(CustomerRegistrationValidator.isPhoneNumber())
        .and(CustomerRegistrationValidator.isAdult())
        .apply(customer);
        
        System.out.println(result);
    }
}

public interface CustomerRegistrationValidator extends Function<Customer, ValidationResult> {
    
    static CustomerRegistrationValidator isEmailValid() {
        return customer -> customer.getEmail().contains("@") ? ValidationResult.SUCCESS : ValidationResult.EMAIL_NOT_VALID;
    }
    
    static CustomerRegistrationValidator isPhoneNumber() {
        return customer -> customer.getPhoneNumber().contains("+08") ? ValidationResult.SUCCESS : ValidationResult.PHONE_NUMER_NOT_VALID;
    }
    
    static CustomerRegistrationValidator isAdult() {
        return customer -> Period.between(customer.getDob(), LocalDate.now()).getYears() > 16 ? ValidationResult.SUCCESS : ValidationResult.IS_NOT_AN_ADULT;
    }
    
    default CustomerRegistrationValidator and (CustomerRegistrationValidator other) {
        return customer -> {
            ValidationResult result = this.apply(customer);
            return result.equals(ValidationResult.SUCCESS) ? other.apply(customer) : result;
        };
    }
    
    enum ValidationResult {
        SUCCESS, PHONE_NUMER_NOT_VALID, EMAIL_NOT_VALID, IS_NOT_AN_ADULT;
    } 
}
在那里,一个
CustomerRegistrationValidator
实例由lambda定义

想象一下你必须重写这个

static CustomerRegistrationValidator isEmailValid() {
  return new CustomerRegistrationValidator() {
    @Override
    public ValidationResult apply(Customer customer) {
      return customer.getEmail().contains("@") ? ValidationResult.SUCCESS : ValidationResult.EMAIL_NOT_VALID;
    }
  };
}

到lambda语法。您将得到您现在所拥有的。

这是表示您希望将这3个函数(isEmailValid、isPhoneNumber、isAdult)应用于变量
customer
的语法。它展示了如何在一条语句中链接多个函数调用。