首页 > 解决方案 > 如何使用返回void的功能接口?

问题描述

我有这个结构:

if (Objects.isNull(user.getMartialStatus())) {
    user.setMartialStatus(MartialStatus.MARRIED);
 }

我有很多,我想使用功能接口优化代码。好的。我写这样的东西:

public static <T> void processIfNull(T o, Supplier<Void> s) {
    if (Objects.isNull(o)) {
        s.get();
    }
}

然后,我等待这段代码可以工作:

processIfNull(user.getMartialStatus(), () -> user.setMartialStatus(MartialStatus.MARRIED));

但IDEA写道:

void 与 void 不兼容

请告诉我应该怎么做。

标签: java

解决方案


正如错误所解释的那样Void,是一个不等同于void. Supplier<Void>期望返回Void就像Supplier<String>期望String对象返回一样。

所以你的功能界面应该如下所示。
它有一个void apply()匹配的签名() -> ...

@FunctionalInterface
public interface ActionIfNotNull {
    void apply();
}

但是,当您搜索内置功能接口时,您可以Runnable按照 Jon Skeet 的建议提出。

解决方案

public static <T> void processIfNull(T o, Runnable s) { // instead of you Runnable can use your own functional interface like ActionIfNotNull
    if (Objects.isNull(o)) {
        s.run();
    }
}

推荐阅读