Java 地图<;字符串,方法引用>;-使用参数运行methodReference

Java 地图<;字符串,方法引用>;-使用参数运行methodReference,java,java-8,method-reference,Java,Java 8,Method Reference,我尝试过这样的方法,但没有成功 包含方法引用的我的映射: private final Map<String, Runnable> validationMethods = new HashMap<>(); { validationMethods.put("getTransactions", ValidationInterceptor::validateTransactions); validationMethods.put("getDeals", Validati

我尝试过这样的方法,但没有成功

包含方法引用的我的映射:

private final Map<String, Runnable> validationMethods = new HashMap<>();

{
  validationMethods.put("getTransactions", ValidationInterceptor::validateTransactions);
  validationMethods.put("getDeals", ValidationInterceptor::validateDeals);
}
private final Map validationMethods=new HashMap();
{
put(“getTransactions”,ValidationInterceptor::validateTransactions);
validationMethods.put(“getDeals”,ValidationInterceptor::ValidateDetails);
}
以下是我试图从地图上运行的方法:

private static void validateTransactions(Method method, List<Object> arguments, Object resourceInstance) {
    doSomthing(method, arguments, resourceInstance);
}

private static void validateDeals(Method method, List<Object> arguments, Object resourceInstance) {
    doSomthing(method, arguments, resourceInstance);
}
validationMethods.get(method.getName()).validate(method, arguments, message);
私有静态void validateTransactions(方法、列表参数、对象resourceInstance){
doSomthing(方法、参数、resourceInstance);
}
私有静态void validatedals(方法、列表参数、对象resourceInstance){
doSomthing(方法、参数、resourceInstance);
}
以及带参数的核心方法:

protected void handleValidation(final Message message, final Method method, final List<Object> arguments) {
    validationMethods.get(method.getName()).run();
}
protectedvoid handleValidation(最终消息、最终方法、最终列表参数){
validationMethods.get(method.getName()).run();
}
问题是-如何将参数传递给静态方法?

定义:

问题是静态方法不能表示为
Runnable
s:method
run
没有参数(当您调用
.run()
时,您不传递参数)

在标准库中,我们没有一个函数可以接受3个参数并返回一个值。如果您将参数的数量减少到2,我们可以使用。如果有一个参数,它将派上用场。这就是为什么在这里声明自己的功能接口是合理的。

定义:

问题是静态方法不能表示为
Runnable
s:method
run
没有参数(当您调用
.run()
时,您不传递参数)


在标准库中,我们没有一个函数可以接受3个参数并返回一个值。如果您将参数的数量减少到2,我们可以使用。如果有一个参数,它将派上用场。这就是为什么在这里声明自己的功能接口是合理的。

我可以看到您使用
方法来定义所需的验证规则。因此,您应该有一个具有所需方法和参数数量的接口:

protected void handleValidation(final Message message, final Method method, final List<Object> arguments) {
    validationMethods.get(method.getName()).run();
}
@功能接口 接口验证规则{

// add as many parameters as you need
void validate(Message message, List<Object> arguments);

我可以看到您使用
方法
来定义所需的验证规则。因此,您应该具有与所需方法和参数数量的接口:

protected void handleValidation(final Message message, final Method method, final List<Object> arguments) {
    validationMethods.get(method.getName()).run();
}
@功能接口 接口验证规则{

// add as many parameters as you need
void validate(Message message, List<Object> arguments);

您的
Map
值是
Runnable
,由于
run()
不带参数,您无法为其分配带参数的方法引用。您的
Map
值是
Runnable
,由于
run()
不带参数,您无法为其分配带参数的方法引用。
public class ValidationService {

    private static final ValidationRule NULL = (message, arguments) -> {};

    private final Map<String, ValidationRule> rules = new HashMap<>();

    {
        rules.put("getTransactions", new GetTransactionsValidationRule());
        rules.put("getDeals", new GetDealsValidationRule());
    }

    public void handleValidation(Message message, Method method, List<Object> arguments) {
        rules.getOrDefault(method.getName()).validate(arguments);
    }

}
ValidationService validationService = new ValidationService();
validationService.handleValidation(...);