Есть ли более чистый способ использования Optional здесь без возврата «NA» в трех местах? - PullRequest
4 голосов
/ 05 марта 2019
    public String getSanitisedMessage() {

        Throwable rootCause = context.getRootCauseException();
        if(rootCause != null) {
            return Optional.ofNullable(rootCause.getMessage())
                    .map(message -> Stream.of(
                            // clean message substrings we want to find
                            "Connection timed out",
                            "Connection reset",
                            "Connection was lost",
                            "FTP Fails"
                    ).filter(subString -> message
                            .toLowerCase()
                            .contains(subString.toLowerCase())
                    ).findFirst().orElse("NA")
                    ).orElse("NA");
        } else return "NA";

    }

Цель состоит в том, чтобы проверить сообщение Throwable на наличие подстрок и, если найдено, вернуть подстроку, в противном случае вернуть NA. Как context.getRootCauseException(), так и Throwable.getMessage() вызовы могут вернуть null.

Ответы [ 2 ]

4 голосов
/ 05 марта 2019

Одним из возможных способов является использование flatMap с findFirst вместо map в качестве:

// method argument is just for the sake of an example and clarification here 
public String getSanitisedMessage(Throwable rootCause, Set<String> primaryCauses) {
    return Optional.ofNullable(rootCause)
            .map(Throwable::getMessage)
            .map(String::toLowerCase)
            .flatMap(message -> primaryCauses.stream()
                    .map(String::toLowerCase)
                    .filter(message::contains)
                    .findFirst())
            .orElse("NA");
}

Или троичный оператор также может использоваться для представления его в виде:

return rootCause == null || rootCause.getMessage() == null ? "NA" :
        primaryCauses.stream().map(String::toLowerCase).filter(subString -> rootCause.getMessage()
                .toLowerCase().contains(subString)).findFirst().orElse("NA");
0 голосов
/ 05 марта 2019

Похоже, вы должны выбросить здесь исключение и обработать его должным образом (кажется, вы собираетесь проверить строку позже). Если вы хотите придерживаться этого способа, вы можете либо добавить значение по умолчанию в context.getMessage () (при условии, что это пользовательский класс, реализующий Context), и вернуть его значение.

В противном случае вы также можете сделать следующее:

 Throwable rootCause = context.getRootCauseException();
    if (rootCause != null) {
        return Stream.of("Connection timed out",
                "Connection reset",
                "Connection was lost",
                "FTP Fails")
                     .filter(s -> s.equalsIgnoreCase(rootCause.getMessage()))
                     .findFirst()
                     .orElse("NA");
    }
    return "NA";
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...