首页 > 解决方案 > 重构方法引用以支持参数

问题描述

我想将方法​​引用生成为每种类型的触发方法,

我按键保存函数接口映射,函数将调用服务方法,但我有一个问题,我无法使用方法引用定义参数,例如:

 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());
}

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

标签: javajava-8method-reference

解决方案


这个问题

functionInterfaces.put(Type.MY_TYPE1, MyService::myTypeMethod1);

MyService::myTypeMethod1是一个实例方法。它必须采用MyService, 因为那是要采取行动的实例。您正在尝试将其分配给Function<User, Boolean>,但在这种情况下,实例在哪里?

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

Map<Type, BiFunction<MyService, Parameters, Boolean>> functionInterfaces = ...

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

在这种情况下,它作用于MyService,接受 aParameter并返回 a Boolean


或者——同样,我们的上下文有限——将MyService方法设为静态就足够了,但你只能在它们不需要任何状态的情况下这样做。


推荐阅读