Java 当Function.apply-Method';它没有被覆盖吗?
在下面的示例代码中,我很难理解“apply”方法的用法。apply方法到底在做什么,因为它没有被覆盖? 它显然返回了结果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",
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
的语法。它展示了如何在一条语句中链接多个函数调用。