sonarLint: сделать этот анонимный внутренний класс лямбдой - PullRequest
3 голосов
/ 15 января 2020

Ниже код имеет уведомление от 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."));

Можете ли вы посоветовать?

1 Ответ

3 голосов
/ 15 января 2020

Вы используете условное выражение: вы не можете иметь выражение throw как его часть. Это первая проблема.

Вторая проблема заключается в том, что вам нужно вызвать исключение, чтобы ваше текущее выражение, использующее условное выражение, не работало, если вы не используете блок:

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

Что больше похоже на копирование / вставку вашего анонимного класса ...

В качестве альтернативы, вы можете использовать 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.")));
...