首页 > 解决方案 > 稍后使用不同的对象/参数调用 Lamba 函数

问题描述

我是java功能接口的新手,所以我想看看这是否可行,如果不可行,请解释一下为什么不可行以及为了实现我的想法有什么可能

我有这些课程

public class A {
...
public String getInfo();
...
}

public class B {
...
public String getOtherInfo();
...
}

我想将对这些函数的引用传递给另一个对象,如下所示:

obj.init(A::getInfo)
obj.init(B::getOtherInfo)

以便稍后我可以在构建函数中的 A 或 B 类型的不同对象上使用/调用这些函数:

obj.build(a1);
obj.build(a2);
...
obj.build(b1);
obj.build(b2);

PS1 我不能为此使用常规接口,因为有很多 getter 和很多类似于 A 的类,我想在这个过程中使用它们,它们彼此不相关

PS2 我尽量避免反射,因为你无法跟踪函数调用

PS3 我的示例并不完全正常,因为它会引发此错误:“无法从静态上下文引用非静态方法”

标签: javalambdafunctional-programming

解决方案


A::get 是Java 方法参考。您应该能够将其存储起来以备后用。因为它是一个实例方法,所以您也需要实例对象。所以这样的事情可能会起作用:

Function<A,String> getFunction = A::get;

每当您需要使用它时,您都可以

//assuming you have an object instance of A which is a
getFunction.apply(a)

您还可以通过声明该方法采用这样的功能参数将其传递给其他方法:

public void someOtherMethod(Function<A,String> param) {
     //do whatever with param.
     //invoke this with an instance of A when you're ready
     param.apply(a);
}

这是一个可能有帮助的参考:https ://www.baeldung.com/java-8-double-colon-operator


推荐阅读