如何为摘要编写 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);
    }));