如何使用返回void的功能接口?

Вяч*_*шов 5 java

我有这个结构:

if (Objects.isNull(user.getMartialStatus())) {
    user.setMartialStatus(MartialStatus.MARRIED);
 }
Run Code Online (Sandbox Code Playgroud)

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

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

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

processIfNull(user.getMartialStatus(), () -> user.setMartialStatus(MartialStatus.MARRIED));
Run Code Online (Sandbox Code Playgroud)

但 IDEA 写道:

void 与 Void 不兼容

请告诉我该怎么办。

TRi*_*iNE 3

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

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

@FunctionalInterface
public interface ActionIfNotNull {
    void apply();
}
Run Code Online (Sandbox Code Playgroud)

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();
    }
}
Run Code Online (Sandbox Code Playgroud)