【问题标题】:Refactor method reference to support parameter(s)重构方法引用以支持参数
【发布时间】:2019-12-10 12:56:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你不是在尝试重新发明语言提供的(糟糕的)东西,是吗?你想用这个“功能图”来完成什么?
  • @Kayaman 定义每个类型执行的函数(不是所有类型)
  • 您想注册事件监听器?
  • 那么你想引入一个抽象层来允许你将一个“键”映射到一个方法吗?这样做有什么好处?你打算用它做什么?这当然不是我推荐的架构方面的东西。
  • 例如的签名是什么? MyService::myTypeMethod1?

标签: java java-8 method-reference


【解决方案1】:

这个问题

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

MyService::myTypeMethod1 是一个 instance 方法。它必须采用MyService,因为这是要对其进行操作的实例。您正在尝试将其分配给 Function&lt;User, Boolean&gt;,但这种情况下的实例在哪里?

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

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

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

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


或者 - 而且,我们的上下文有限 - 将 MyService 方法设为静态就足够了,但只有在它们不需要任何状态时才能这样做。

【讨论】:

  • @user7294900 和你现在一样。但是您需要以不同的方式调用它(2 个参数,而不是 1 个)
  • 如果我使用 Spring 服务,它调用自己的方法为 this::myTypeMethod1,你会建议改变什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多