如何将方法调用传递给方法 (Java 8)

How to pass a method invocation to a method (Java 8)

提问人:snaydjoW 提问时间:1/2/2023 最后编辑:snaydjoW 更新时间:1/2/2023 访问量:56

问:

我的原始代码是这样的:

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”

Java 方法 参数传递 重构

评论

0赞 Andy Thomas 1/2/2023
通常,“如何传递方法”的答案是声明一个方法,该方法接受一个接口,该接口包含要调用的方法的签名。理想情况下,这是一个@FunctionalInterface,以便于传递 lambda。
0赞 Andy Thomas 1/2/2023
这回答了你的问题吗?将方法作为参数传递
0赞 snaydjoW 1/2/2023
我重写了这个问题,以澄清我所处的位置。到目前为止提供的帮助让我感动了,但我仍然坚持如何将它们联系在一起。

答:

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