我正在寻找一种通过引用传递方法的方法。我知道Java不传递方法作为参数,但是,我想要一个替代方案。
我被告知接口是作为参数传递方法的替代方案,但我不理解接口如何通过引用充当方法。如果我理解正确的话,接口只是一组没有定义的抽象方法。我不想发送一个每次都需要定义的接口,因为几个不同的方法可以用相同的参数调用相同的方法。
我想要完成的是类似这样的事情:
public void setAllComponents(Component[] myComponentArray, Method myMethod) {
for (Component leaf : myComponentArray) {
if (leaf instanceof Container) { //recursive call if Container
Container node = (Container) leaf;
setAllComponents(node.getComponents(), myMethod);
} //end if node
myMethod(leaf);
} //end looping through components
}
调用方法如下:
setAllComponents(this.getComponents(), changeColor());
setAllComponents(this.getComponents(), changeSize());
关于如何使用java.util.function.Function作为简单方法的参数函数,我没有找到任何足够明确的示例。这里有一个简单的例子:
import java.util.function.Function;
public class Foo {
private Foo(String parameter) {
System.out.println("I'm a Foo " + parameter);
}
public static Foo method(final String parameter) {
return new Foo(parameter);
}
private static Function parametrisedMethod(Function<String, Foo> function) {
return function;
}
public static void main(String[] args) {
parametrisedMethod(Foo::method).apply("from a method");
}
}
基本上你有一个Foo对象和一个默认构造函数。将作为参数从类型为Function<String, Foo>的parameterisedmethod中调用的方法。
>表示该函数以String作为参数并返回Foo。
Foo::方法对应于类似x的lambda -> Foo. Method (x);
parameterisedmethod (Foo::method)可以被看作x -> parameterisedmethod (Foo.method(x))
apply("from a method")基本上是执行parameterisedmethod (Foo。方法("来自一个方法"))
然后在输出中返回:
>> I'm a Foo from a method
示例应该按原样运行,然后您可以使用不同的类和接口从上面的答案中尝试更复杂的东西。
我不是java专家,但我可以这样解决你的问题:
@FunctionalInterface
public interface AutoCompleteCallable<T> {
String call(T model) throws Exception;
}
我在我的特殊接口中定义了参数
public <T> void initialize(List<T> entries, AutoCompleteCallable getSearchText) {.......
//call here
String value = getSearchText.call(item);
...
}
最后,我实现getSearchText方法,同时调用初始化方法。
initialize(getMessageContactModelList(), new AutoCompleteCallable() {
@Override
public String call(Object model) throws Exception {
return "custom string" + ((xxxModel)model.getTitle());
}
})
自Java 8以来,有一个Function<T, R>接口(docs),它有方法
R apply(T t);
您可以使用它将函数作为参数传递给其他函数。T是函数的输入类型,R是返回类型。
在你的例子中,你需要传递一个函数,它接受Component类型作为输入,并且不返回任何东西——Void。在这种情况下,Function<T, R>不是最好的选择,因为没有Void类型的自动装箱。您正在寻找的接口名为Consumer<T> (docs) with method
void accept(T t);
它看起来是这样的:
public void setAllComponents(Component[] myComponentArray, Consumer<Component> myMethod) {
for (Component leaf : myComponentArray) {
if (leaf instanceof Container) {
Container node = (Container) leaf;
setAllComponents(node.getComponents(), myMethod);
}
myMethod.accept(leaf);
}
}
你可以使用方法引用来调用它:
setAllComponents(this.getComponents(), this::changeColor);
setAllComponents(this.getComponents(), this::changeSize);
假设在同一个类中定义了changeColor()和changeSize()方法。
如果你的方法碰巧接受多个参数,你可以使用bifuncfunction <T, U, R> - T和U是输入参数的类型,R是返回类型。还有bicconsumer< T, U>(两个参数,没有返回类型)。不幸的是,对于3个或更多的输入参数,您必须自己创建一个接口。例如:
public interface Function4<A, B, C, D, R> {
R apply(A a, B b, C c, D d);
}
首先用要作为参数传递的方法定义一个Interface
public interface Callable {
public void call(int param);
}
使用该方法实现一个类
class Test implements Callable {
public void call(int param) {
System.out.println( param );
}
}
//像这样调用
Callable cmd = new Test();
这允许您将cmd作为参数传递,并调用接口中定义的方法调用
public invoke( Callable callable ) {
callable.call( 5 );
}