如何为摘要编写 lambda 表达式 class
how to write lambda expression for the abstract class
我有抽象class,它有两个方法如下:
public abstract class SessionExecutionBody {
public Object execute() {
executeWithoutResult();
return null;
}
public void executeWithoutResult() {}
}
我按如下方式实现 class:
final HTTPDestination destination = sessionService.executeInLocalView(new SessionExecutionBody() {
@Override
public Object execute() {
userService.setCurrentUser(userService.getAdminUser());
final String destinationName = getConfigurationService().getConfiguration().getString(DESTINATION_PROPERTY);
return getHttpDestinationService().getHTTPDestination(destinationName);
当我 运行 sonarLint 显示主要问题时,将这个匿名 class 转换为 lambda 表达式,但我找不到正确的方法,我可以将该表达式转换为 lambda 吗?
恐怕你不能。这不是一个功能接口,只有一个抽象方法以 lambda 风格实现它。
Can I convert that expression into a lambda?
如果您进行以下更改就可以:
@FunctionalInterface // to guarantee the next rule
interface SessionExecutionBody {
Object execute(); // has exactly one abstract method
default void executeWithoutResult() {} // other methods should be default/static
}
...
sessionService.executeInLocalView(() -> { /* a body */ return ...; })
您不能将 abstract class
的 subclass 转换为 lambda 表达式,否则可以认为审计工具存在错误。作为 ,这里使用 lambda 表达式的一种解决方案是将 abstract class
转换为 interface
.
如果那不是一个选项,例如由于与使用 class 的其他代码的兼容性,您可以提供足够简单的工厂方法以从 lambda 表达式中受益,同时仍然允许 subclassing:
public abstract class SessionExecutionBody {
public static SessionExecutionBody withResult(Supplier<?> s) {
Objects.requireNonNull(s);
return new SessionExecutionBody() {
@Override public Object execute() { return s.get(); }
};
}
public static SessionExecutionBody withoutResult(Runnable r) {
Objects.requireNonNull(r);
return new SessionExecutionBody() {
@Override public void executeWithoutResult() { r.run(); }
};
}
public Object execute() {
executeWithoutResult();
return null;
}
public void executeWithoutResult() {}
}
您可以将其用作
final HTTPDestination destination = sessionService.executeInLocalView(
SessionExecutionBody.withResult(() -> {
userService.setCurrentUser(userService.getAdminUser());
final String destinationName =
getConfigurationService().getConfiguration().getString(DESTINATION_PROPERTY);
return getHttpDestinationService().getHTTPDestination(destinationName);
}));
我有抽象class,它有两个方法如下:
public abstract class SessionExecutionBody {
public Object execute() {
executeWithoutResult();
return null;
}
public void executeWithoutResult() {}
}
我按如下方式实现 class:
final HTTPDestination destination = sessionService.executeInLocalView(new SessionExecutionBody() {
@Override
public Object execute() {
userService.setCurrentUser(userService.getAdminUser());
final String destinationName = getConfigurationService().getConfiguration().getString(DESTINATION_PROPERTY);
return getHttpDestinationService().getHTTPDestination(destinationName);
当我 运行 sonarLint 显示主要问题时,将这个匿名 class 转换为 lambda 表达式,但我找不到正确的方法,我可以将该表达式转换为 lambda 吗?
恐怕你不能。这不是一个功能接口,只有一个抽象方法以 lambda 风格实现它。
Can I convert that expression into a lambda?
如果您进行以下更改就可以:
@FunctionalInterface // to guarantee the next rule
interface SessionExecutionBody {
Object execute(); // has exactly one abstract method
default void executeWithoutResult() {} // other methods should be default/static
}
...
sessionService.executeInLocalView(() -> { /* a body */ return ...; })
您不能将 abstract class
的 subclass 转换为 lambda 表达式,否则可以认为审计工具存在错误。作为 abstract class
转换为 interface
.
如果那不是一个选项,例如由于与使用 class 的其他代码的兼容性,您可以提供足够简单的工厂方法以从 lambda 表达式中受益,同时仍然允许 subclassing:
public abstract class SessionExecutionBody {
public static SessionExecutionBody withResult(Supplier<?> s) {
Objects.requireNonNull(s);
return new SessionExecutionBody() {
@Override public Object execute() { return s.get(); }
};
}
public static SessionExecutionBody withoutResult(Runnable r) {
Objects.requireNonNull(r);
return new SessionExecutionBody() {
@Override public void executeWithoutResult() { r.run(); }
};
}
public Object execute() {
executeWithoutResult();
return null;
}
public void executeWithoutResult() {}
}
您可以将其用作
final HTTPDestination destination = sessionService.executeInLocalView(
SessionExecutionBody.withResult(() -> {
userService.setCurrentUser(userService.getAdminUser());
final String destinationName =
getConfigurationService().getConfiguration().getString(DESTINATION_PROPERTY);
return getHttpDestinationService().getHTTPDestination(destinationName);
}));