java - 重构方法引用以支持参数
问题描述
我想将方法引用生成为每种类型的触发方法,
我按键保存函数接口映射,函数将调用服务方法,但我有一个问题,我无法使用方法引用定义参数,例如:
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());
}
我可以重构代码以使用单一方法吗?
解决方案
这个问题
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
方法设为静态就足够了,但你只能在它们不需要任何状态的情况下这样做。
推荐阅读
- c - 为什么我基于 OpenCL 的排序算法结果是错误的?
- spring - SPRING、API、POST 正文请求
- ios - 如何为多个 HKQuantityType 标识符启用BackgroundDelivery?
- javascript - Chartjs 用于甜甜圈图的自定义图例,每个部分都带有标签线
- python - Airflow UI 无法找到提供程序模块
- sql - 如何在 SQL 中计算年龄
- postgresql - Postgres 用户无法运行位于我用户主目录中的种子文件
- python - Healpix - 将经度、纬度转换为银河坐标
- django - Django Query 获取 mongodb ArrayField 列的所有不同值的计数
- aws-glue - 要写入自定义日志组的 AWS Glue 日志