java8 函数接口处理回调

2022-09-02 19:27:18

我有一个通用的私有方法,它执行常见任务并被其他方法使用。泛型方法具有支持调用的其他方法的条件。例:ifelse

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`;
  }
}

我想使用Java 8 lambda,并且我创建了一个用方法调用的功能接口。Invokerinvoke

public interface Invoker{
  public void invoke()
}

现在我的泛型方法看起来像这样,公共方法适当地处理调用函数回调:

private void myGenericMethod(Invoker invoker){
  common task1;
  common task2;
  invoker.invoke();
}  

JDK 中是否有我可以使用的功能接口,而不是自己创建此接口?


答案 1

package java.util.function 不包含函数接口,该接口具有不需要任何参数的方法并返回 。但是你可以改用 Runnable 接口。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!");
});

其他选项

您可能还对其他功能接口感兴趣,例如:

为什么接口没有其他选择?Runnable

对于不返回任何内容且不期望任何参数的 lambda 使用接口对于许多程序员来说可能听起来有争议。 发明是为了在单独的线程中运行代码,许多程序员通过多线程来标识此类。甚至文档也说:RunnableRunnable

接口应由其实例旨在由线程执行的任何类实现。Runnable

2年前,有人已经问过类似的问题,如果你看看这个评论Brian Goetz对它的反应,你就会明白Java语言设计师得出的结论是,没有必要创建另一个模仿接口实现的功能接口。Runnable


答案 2

还可以使用 。它可能看起来像这样Consumer<Void>

public void init(Consumer<Void> callback) {
    callback.accept(null);
}

init((Void) -> done());

推荐