我有这个结构:
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 不兼容
请告诉我该怎么办。
正如错误所解释的那样,Void
这是一个不等于 的类void
。Supplier<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)