我有一个通用的私有方法,它执行常见的任务,并被其他方法使用。泛型方法具有if和else条件,以支持调用的其他方法。示例:
private void myGenericMethod(String name, int age){
common task1;
common task2;
if(name!= null && name.length > 0){
specific task 1;
specific task 2;
} else{
specific task 3;
specific task 4;
}
if(age > 18){
specific task 1`;
specific task 2`;
}
}我想使用Java8lambda,并且我已经用invoke方法创建了一个名为Invoker的函数接口。
public interface Invoker{
public void invoke()
}现在我的泛型方法看起来像这样,公共方法适当地处理调用函数回调:
private void myGenericMethod(Invoker invoker){
common task1;
common task2;
invoker.invoke();
} JDK中有没有一个函数接口可以用来代替我自己创建这个接口?
发布于 2017-08-04 14:43:40
Package java.util.function不包含带有方法的函数接口,该方法不需要任何参数并返回void。但是你可以使用接口来代替。
private void myGenericMethod(Runnable runnable){
common task1;
common task2;
//consider checking if runnable != null to avoid NPE
runnable.run();
} 那么调用就会看起来非常简单:
myGenericMethod(() -> {
//do something fancy
System.out.println("Hello, world!");
});其他选项
您可能会对其他功能接口感兴趣,例如:
如果希望在不传递任何parameters
Function的情况下返回R
Consumer值,则返回void
;如果希望将值T作为参数传递,则返回T;如果希望将值T作为参数传递,则返回T
为什么没有Runnable接口的替代品?
对于不返回任何内容并且不需要任何参数的lambda,使用Runnable接口对于许多程序员来说可能听起来很有争议。Runnable是为了在单独的线程中运行代码而发明的,许多程序员将这个类与多线程联系起来。甚至连documentation都说:
Runnable接口应该由任何类实现,该类的实例应该由线程执行。
2年前有人使用already asked similar question,如果你看看this comment和Brian Goetz's对它的反应,你就会明白Java语言设计者得出的结论是,没有必要创建另一个模仿Runnable接口实现的函数接口。
发布于 2019-06-06 17:35:48
也有可能使用Consumer<Void>。它可能看起来像这样
public void init(Consumer<Void> callback) {
callback.accept(null);
}
init((Void) -> done());发布于 2019-09-23 19:51:55
我建议使用Consumer作为回调接口。与JavaScript语言相比,回调是与作用域绑定的。因此,如果使用Consumer接口,则可以将作用域作为参数传递给函数。例如:
public void startTracer(String tracerName, Event boundEvent) {
executeOnTracer(tracer -> tracer.startTracer(tracerName, boundEvent));
}
...
private void executeOnTracer(Consumer<Tracer> callback) {
TracerController tracer = null;
if (isTracerActive()) {
tracer = getTracer();
}
Optional.ofNullable(tracer).ifPresent(callback::accept);
}https://stackoverflow.com/questions/45499828
复制相似问题