我想知道是否在Java中可以创建一个返回方法的方法:在处理表单时,我需要检查用户用正确的模式填充它的每个字段。每个字段的检查都不同,因此我为每个字段创建了一个不同的方法,现在我想编写一个方法,该方法可以根据我的字段“重新路由”我(即告诉我我需要使用哪种验证方法) m检查。
我想知道是否可以通过使用函数来做到这一点?
EDIT(很抱歉不首先发布该内容):更具体地说,这里的复杂之处在于该方法不会返回任何内容,而是用于在字段中生成异常未验证。例如:
private void emailValidation(String email) throws Exception {
if (email != null) {
if (!email.matches("([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+([^.@]+)")) {
throw new Exception("The e-mail is not valid.");
}
} else {
throw new Exception("Please write an e-mail address.");
}
}
是的,我知道我可以使用函数,但是我看到的所有示例都很简单,或者在任何情况下都不能处理异常,而且我不知道在这种情况下如何使用这些功能。
编辑:我应该做类似的事情吗?
private Consumer<String> validation(Field field) throws Exception {
try {
switch (field) {
case Name:
return value -> nameValidation(value);
break;
case Email:
return value -> emailValidation(value);
break;
case Password:
return value -> passwordValidation(value);
break;
}
} catch (Exception e) {
throw new Exception(e.getMessage());
}
}
在这里我真的看不到使用功能接口的意义(因为我显然不明白),没有它我可以做类似的事情。
例外情况可能不是最好的做法,但这是练习限制的一部分。实际上,我个人(我想是菜鸟)觉得它很优雅,因为它是我们抛出的一个错误,而方便的部分是,它可以在获取有关它的信息时知道有一个错误(嗯,这是一个错误。处理错误的对象)。
答案 0 :(得分:2)
是的,可以创建一个返回方法的方法。
这就是Java 8中引入的功能接口,lambda和方法引用的全部意义,即将方法视为可以传递的对象。
让我们说您需要一种验证int
值的方法,即您需要一种类似boolean isValid(int value)
的方法。为此,您可以使用内置的IntPredicate
功能界面。
public static IntPredicate getAgeValidator() {
return i -> i >= 21;
}
该方法返回一个用于验证年龄(int
值)至少为21岁的方法。
然后可以像这样使用返回的“验证方法”:
int age = 25;
boolean valid = getAgeValidator().test(age);
答案 1 :(得分:0)
您可能意味着您想从方法中返回。在这种情况下,您可以简单地指示方法已完成:
return;
如果返回类型不为空,则必须返回以下内容:
return "some string";
或
return myObject;
Lambdas
但是,您可能意味着您实际上想返回一个函数。例如。您想返回一个lambda。 Java,取代了Java 8中语言的最新功能,仍然没有真正的一流功能。您可以考虑返回Function类型的实例:
Function<String, String> getSomeFunction() {
return (paramOfTheFunction) -> "This is a function with param: " + paramOfTheFunction;
}
在泛型(“ <>”)中,第一个字符串是输入类型,第二个字符串是输出类型。然后您可以像这样调用它:
void myMethod() {
Function<String, String> myFunc = getSomeFunction();
string output = myFunc.apply("foo"); // Outputs "This is a function with param: foo"
System.out.println(output);
}
反射
但是,还有第三种情况:您可能想实际返回一个方法(类似于C ++中的函数指针)。通过反射可以做到这一点。
void methodA() {
System.out.println("foobar");
}
Method getMethodA() {
// null because methodA has no parameters; this specifies parameter types
return getClass().getMethod("methodA", null);
}
然后,您可以使用其调用方法执行返回的方法:
getMethodA().invoke(this);
调用需要作为其成员的类的实例作为第一个参数。其他参数可以选择提供参数。
然后,您可以使用其调用方法执行返回的方法:
getMethodA().invoke(this);
调用需要作为其成员的类的实例作为第一个参数。其他参数可以选择提供参数。