首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理回调的java8函数接口

处理回调的java8函数接口
EN

Stack Overflow用户
提问于 2017-08-04 14:42:11
回答 3查看 25.9K关注 0票数 16

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

代码语言:javascript
复制
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的函数接口。

代码语言:javascript
复制
public interface Invoker{
  public void invoke()
}

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

代码语言:javascript
复制
private void myGenericMethod(Invoker invoker){
  common task1;
  common task2;
  invoker.invoke();
}  

JDK中有没有一个函数接口可以用来代替我自己创建这个接口?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-04 14:43:40

Package java.util.function不包含带有方法的函数接口,该方法不需要任何参数并返回void。但是你可以使用接口来代替。

代码语言:javascript
复制
private void myGenericMethod(Runnable runnable){
    common task1;
    common task2;
    //consider checking if runnable != null to avoid NPE
    runnable.run();
}  

那么调用就会看起来非常简单:

代码语言:javascript
复制
myGenericMethod(() -> {
    //do something fancy
    System.out.println("Hello, world!");
});

其他选项

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

如果希望在不传递任何parameters

;如果希望将值T作为参数传递,则返回T;如果希望将值T作为参数传递,则返回T

为什么没有Runnable接口的替代品?

对于不返回任何内容并且不需要任何参数的lambda,使用Runnable接口对于许多程序员来说可能听起来很有争议。Runnable是为了在单独的线程中运行代码而发明的,许多程序员将这个类与多线程联系起来。甚至连documentation都说:

Runnable接口应该由任何类实现,该类的实例应该由线程执行。

2年前有人使用already asked similar question,如果你看看this commentBrian Goetz's对它的反应,你就会明白Java语言设计者得出的结论是,没有必要创建另一个模仿Runnable接口实现的函数接口。

票数 36
EN

Stack Overflow用户

发布于 2019-06-06 17:35:48

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

代码语言:javascript
复制
public void init(Consumer<Void> callback) {
    callback.accept(null);
}

init((Void) -> done());
票数 9
EN

Stack Overflow用户

发布于 2019-09-23 19:51:55

我建议使用Consumer作为回调接口。与JavaScript语言相比,回调是与作用域绑定的。因此,如果使用Consumer接口,则可以将作用域作为参数传递给函数。例如:

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45499828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档