sonarLint:使这个匿名内部 class 成为 lambda

sonarLint: make this anonymous inner class a lambda

下面的代码有来自 SonarLint 的通知:

handler.setFileNameGenerator((new FileNameGenerator() {
    @Override
    public String generateFileName(Message<?> message) {
        if (message.getPayload() instanceof File) {
            return ((File) message.getPayload()).getName();
        } else {
            throw new IllegalArgumentException("File expected as payload.");
        }
    }
}));

我正在尝试以下操作,但 throw new IllegalArgumentException 部分有问题:

handler.setFileNameGenerator(message -> 
       (message.getPayload() instanceof File) ? 
       ((File) message.getPayload()).getName() : 
       throw new IllegalArgumentException("File expected as payload."));

能请教一下吗?

您正在使用条件表达式:您不能将 throw 语句作为其中的一部分。这是第一个问题。

第二个挑战是您需要引发异常,因此您当前使用条件表达式的表达式将不起作用,除非您使用块:

handler.setFileNameGenerator(message -> {
    if (message.getPayload() instanceof File) {
        return ((File) message.getPayload()).getName();
    } else {
        throw new IllegalArgumentException("File expected as payload.");
    }
});

这看起来更像是您匿名 class 的 copy/paste...

或者,您可以使用 Optional 来清理它:

handler.setFileNameGenerator(message -> Optional.of(message.getPayload())
        .filter(p -> p instanceof File)
        .map(f -> (File) f)
        .map(File::getName)
        .orElseThrow(() -> new IllegalArgumentException("File expected as payload.")));