Отфильтруйте массив файлов cookie для указанного c cook ie и получите значение указанного c cook ie в Java - PullRequest
3 голосов
/ 28 мая 2020

Я исправляю некоторую проблему в устаревшем модуле и наткнулся на этот код, который получает массив файлов cookie из объекта запроса, который может возвращать null. Код ищет специфицированное c cook ie, если оно присутствует, возвращает значение cook ie, иначе возвращает null. Ниже приведен существующий код

final Cookie[] cookies = request.getCookies();
if (cookies != null) {
    for (int i = 0; i < cookies.length; i++) {
        final Cookie cookie = cookies[i];
        if ("random cookie".equals(cookie.getName())) {
            return cookie.getValue();
        }
    }
    return null;
}

Я реорганизовал его примерно так:

final Cookie[] cookies = request.getCookies();
if (cookies != null) {
    Optional<Cookie> cookie = Arrays.stream(cookies).
            filter(e -> "random cookie".equals(e.getName())).
            findAny();
    return cookie.isPresent() ? cookie.get().getValue() : null;
}
return null;

Можно ли лучше реорганизовать приведенное выше?

Ответы [ 2 ]

4 голосов
/ 28 мая 2020

Было бы лучше, чтобы метод возвращал Optional<String> - но если вы не можете, то как насчет этого:

final Cookie[] maybeCookies = request.getCookies();
return Optional.ofNullable(maybeCookies)
    .flatMap(cookies -> Arrays.stream(cookies)
         //Find the cookie if we can.
         .filter(e->"random cookie".equals(cookie.getName()))
         .findAny()
    )
    //If we have a matching cookie, return its value.
    .map(e->e.getValue())
    //otherwise return null to retain original behaviour
    .orElse(null);
3 голосов
/ 28 мая 2020

Я бы преобразовал это в метод, который возвращает Optional<String>:

public Optional<String> getCookieValue(String name) {
   final Cookie[] cookies = request.getCookies();
   if(cookies == null) return Optional.empty();
   return Arrays.stream(cookies)
                .filter(e -> name.equals(e.getName()))
                .findAny().map(Cookie::getValue);
} 

, тогда вызывающий этот метод будет делать любое из этих действий в зависимости от того, как они намереваются использовать результат:

getCookieValue("random cookie").ifPresent(e -> { ... });
getCookieValue("random cookie").orElse(null);
....
....

return Optional<String>, чтобы не иметь дело с nullity и позволить пользователю этого метода решать, что делать в «случае отсутствия значения». Это также лучше читается для пользователя этого API et c ....

Однако , если вы sh сохраняете свою текущую подпись метода, вы можете по крайней мере улучшите его до:

final Cookie[] cookies = request.getCookies();
if(cookies == null) return null; // avoids if blocks
return Arrays.stream(cookies)
             .filter(e -> "random cookie".equals(e.getName()))
             .findAny()
             .map(Cookie::getValue)
             .orElse(null);
...