提问人:snaydjoW 提问时间:1/2/2023 最后编辑:snaydjoW 更新时间:1/2/2023 访问量:56
如何将方法调用传递给方法 (Java 8)
How to pass a method invocation to a method (Java 8)
问:
我的原始代码是这样的:
SpecificEntity result = broker.changeSpecificEntity ( myTestKey , myTestData ) ;
“broker”是一个(接口/实现门面),为许多实体类型中的每一种都提供了多个方法(创建、更改、删除等)。
我想实现代码的通用版本,这样我就不必重复自己了。代码比此处显示的要多,但其余代码已经是泛型的。
这就是我们目前所拥有的。
public < K extends Key , D extends Data > D changeAnyEntity ( final K testKey, final D testData, BiFunction<K, D, D> brokerMethod )
{
return brokerMethod.apply ( testKey , testData ) ;
}
现在,我需要为测试中的每个方法调用一个泛型方法(例如,changeAnyEntity)。
SpecificEntity result = changeAnyEntity ( myTestKey , myTestData , myBrokerFuncion )
我还没有弄清楚如何定义/创建“myBrokerFunction”
答:
0赞
Klitos G.
1/2/2023
#1
使用单个方法创建一个接口,接受所需的参数并返回所需的类型。 然后,您可以将该接口用作参数类型,并且可以避免泛型方法中所有不必要的强制转换。之所以让它成为通用的,是为了避免“了解”所有单独的子类型
@FunctionalInterface
interface BrokerFun<KK, DD> {
DD changeEntity(KK key, DD data);
}
public < K extends Key , D extends Data > boolean changeAnything (
final K testKey,
final D testData,
BrokerFun<K, D> brokerFun
) {
try {
D result = brokerFun.changeEntity(testKey,testData);
return isEqualCriticalFields(result, testData);
} catch ( final Exception e ) {
return false ;
}
}
EDIT(添加双函数解)
或者,您可以像这样使用 BiFunction 接口
public < K extends Key , D extends Data > boolean changeAnything (
final K testKey,
final D testData,
BiFunction<K, D, D> brokerFun
) {
try {
D result = brokerFun.apply(testKey,testData);
return isEqualCriticalFields(result, testData);
} catch ( final Exception e ) {
return false ;
}
}
评论
0赞
snaydjoW
1/2/2023
谢谢 - 我会再看一看 - 我上面的评论(显然带有糟糕的降价)显示了我目前卡住的地方。
0赞
Klitos G.
1/2/2023
好的,我看到你想使用BiFunction,让我添加到我的答案中
0赞
Klitos G.
1/2/2023
我添加了一个 BiFunction 解决方案。你不需要为你的接口声明另一个泛型类型,我认为这就是你感到困惑的地方。BiFunction 或声明的 Interface 应使用其他参数的类型,K 和 D 是您唯一需要的泛型类型。这样,您将确保不能使用不兼容的类型调用此函数
0赞
snaydjoW
1/2/2023
你对我感到困惑是对的,但看起来你已经完成了我的目标(并不是说我关心我是否使用 BiFunction——我只是想要一些有效且没有气味的东西;-))现在已经很晚了(1 月 1 日),所以我明天可能会继续。我想我仍然缺少我提供代理函数 changeAnything ( myTestKey , myTestData , myBrokerFunction ) 的部分,其中代理函数最初是“broker.changeEntity”
0赞
snaydjoW
1/2/2023
#2
最后。。。忽略 try/catch 逻辑
final BiFunction < SpecificEntityKey , SpecificEntityData , SpecificEntityData >
brokerMethod = ( k , d ) -> { myBroker.changeSpecificEntity ( k , d , null ) ; return d ; } ;
评论
0赞
snaydjoW
1/3/2023
当然,通过定义我自己的接口而不是使用 BiFunction,我能够包含必要的抛出声明,并且一切都可以完美地运行。谢谢你们俩。出于某种原因,我不能@你们俩!@AndyThomas
0赞
snaydjoW
1/3/2023
谢谢你们俩。出于某种原因,我不能@你们俩!@KlitosG
评论