Преобразование Итерации массива в выражение лямбда

У меня есть код, который выполняет итерацию с Cookies до reset cookie, чье имя соответствует CookieSession.NAME

  Cookie[] cookies = httpServletRequest.getCookies();
        LOGGER.info("Clearing cookies on welcome page");
        if (cookies != null)
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals(CookieSession.NAME)) {                      
                cookie.setValue(null);
                cookie.setMaxAge(0);
                cookie.setPath("/");
                httpServletResponse.addCookie(cookie);
              }
            }

может кто-то упростить его с помощью выражения java 8 lambda

Ответ 1

Не уверен, что это будет упрощено, но это можно сделать, да:

Arrays.stream(cookies)
      .filter(c -> c.getName().equals(CookieSession.NAME))
      .forEach(cookie -> {
          cookie.setValue(null);
          cookie.setMaxAge(0);
          cookie.setPath("/");
          httpServletResponse.addCookie(cookie);
      });

Ответ 2

Цикл for можно заменить выражением forEach:

Arrays.stream(cookies)
      .filter(c -> c.getName().equals(CookieSession.NAME))
      .forEach(c -> {c.setValue(null);
                     c.setMaxAge(0);
                     c.setPath("/");
                     httpServletResponse.addCookie(c);
                    });

Ответ 3

Arrays.stream(httpsServletRequest.getCookies())
    .filter(cookie -> CookieSession.NAME.equals(cookie.getName()))
    .forEach(cookie -> {
        cookie.setValue(null); 
        cookie.setMaxAge(0); 
        cookie.setPath("/");
        httpServletResponse.addCookie(cookie); 
    });

Ответ 4

Другие ответы, похоже, проигнорировали if (cookies != null). Также мне нравится peek для нескольких промежуточных операций, а не для блока. Мне кажется яснее.

Optional.ofNullable(httpServletRequest.getCookies())
    .ifPresent(cookies -> Arrays.stream(cookies)
        .filter(cookie -> cookie.getName().equals(CookieSession.NAME))
        .peek(cookie -> cookie.setValue(null))
        .peek(cookie -> cookie.setMaxAge(0))
        .peek(cookie -> cookie.setPath("/"))
        .forEach(httpServletResponse::addCookie));

Ответ 5

Это невозможно упростить, используя лямбда или forEach.

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

cookies.forEach(cookie -> httpServletResponse.addCookie(cookie));

Однако, это действительно вопрос стиля. Пока forEach потребляет элементы последовательно (а не параллельно), нет ничего, что могло бы пойти не так, как результат такой строки.

Вот совет Oracle по этому вопросу.

По-моему, вы должны оставить свой код так, как есть.