重构方法参考以支持参数

时间:2019-12-10 12:56:01

标签: java java-8 method-reference

我想泛型地引用每种类型的触发方法,

我通过键保存功能接口的映射,功能将调用services方法,但是我有一个问题,我无法使用方法引用来定义参数,例如:

 private Map<Type, Function<User, Boolean>> functionInterfaces = new HashMap<>();
 {
    functionInterfaces.put(Type.MY_TYPE1, MyService::myTypeMethod1);
    functionInterfaces.put(Type.MY_TYPE2, MyService::myTypeMethod2);
    functionInterfaces.put(Type.MY_TYPE3, MyService::myTypeMethod3);
 }

当前我需要为每种类型创建方法

private boolean myTypeMethod1(Parameters parameters) {
    return myGenericTypeMethod(parameters, Type.MY_TYPE1);
}
private boolean myTypeMethod2(Parameters parameters) {
    return myGenericTypeMethod(parameters, Type.MY_TYPE2);
}

我使用apply调用函数:

if (map.containsKey(key)) {
    map.get(key).apply(new Parameters.Builder().build());
}

我可以重构代码以使用单一方法吗?

1 个答案:

答案 0 :(得分:3)

这个问题

selenium.open chrome url google.com
delay 2
window ✱Google✱ 
selenium.click search gb_70 by id
selenium.click search //*[@id="identifierId"] by xpath
♥login = ♥credential⟦gmail:login⟧
♥password = ♥credential⟦gmail:password⟧
keyboard ♥login 
keyboard ⋘enter⋙
delay 2
selenium.click search //*[@id="password"]/div[1]/div/div[1]/input by xpath
keyboard ♥password
keyboard ⋘enter⋙

functionInterfaces.put(Type.MY_TYPE1, MyService::myTypeMethod1); instance 方法。它必须使用MyService::myTypeMethod1,因为这是要执行的实例。您正在尝试将其分配给MyService,但是在这种情况下实例在哪里?

我不知道这是否有意义,因为我们没有太多上下文,而是将声明更改为

Function<User, Boolean>

至少可以解决编译器的问题。

在这种情况下,它对Map<Type, BiFunction<MyService, Parameters, Boolean>> functionInterfaces = ... 起作用,接受MyService并返回Parameter


或者,同样,我们又有一个有限的上下文,将Boolean方法设为静态就足够了,但是只有在它们不需要任何状态时,您才可以这样做。