假设我有 2 个方法看起来像这样:
private static boolean validate1(String line)
private static boolean validate2(String line)
我使用的方法取决于用户作为参数传入的内容,所以我只想使用其中一种方法。
如果我想遍历字符串列表,我是否必须每次检查使用什么方法,或者有没有办法存储我想要的方法并使用函数指针等参数调用它?
由于验证方法的签名相同,因此可以将Function<String, Boolean>
映射到字符串,如下所示:
class Main {
public static boolean validate1(String s) { return true; }
public static boolean validate2(String s) { return false; }
public static void main(String[] args) {
Map<String, Function<String, Boolean>> funcMap = new HashMap<>();
funcMap.put("First", Main::validate1);
funcMap.put("Second", Main::validate2);
System.out.println(funcMap.get("First").apply("Wow!"));
}
}
此处的输出将是 true
.
如果使用 Java 8 或更高版本,则可以执行以下操作。
为您的方法创建一个功能接口,如下所示:
@FunctionalInterface
interface Validator {
boolean validate(String s);
}
在使用 2 个静态方法的类中,您现在可以将其中一个方法分配给变量。根据参数,您可以分配 validate1 方法:
Validator v = this::validate1;
或 Validate2 方法:
Validator v = this::validate2;
然后,您可以在循环中使用验证器对象来执行验证。
for(String s : strings) {
v.validate(s);
}
或者使用 List 接口中的新 forEach(( 方法,或者使用 Streams API。您可以随心所欲地使用它。