将Array迭代转换为lambda表达式

时间:2016-04-08 20:12:25

标签: java lambda java-8

我有以下代码,它迭代Cookies以重置名称与CookieSession.NAME匹配的Cookie

  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表达式来简化它吗

5 个答案:

答案 0 :(得分:8)

不确定它是否会被简化,但可以这样做,是的:

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

答案 1 :(得分:5)

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);
                    });

答案 2 :(得分:5)

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

答案 3 :(得分:5)

其他答案似乎忽略了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));

答案 4 :(得分:4)

无法使用lambda或forEach来简化此操作。

此外,许多人认为你不应该使用forEach来修改状态,如下所示:

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

然而,这确实是一种风格问题。只要forEach按顺序(而不是并行)消耗元素,就没有任何东西可以像这样的行那样出错。

Here is Oracle's advice on the subject

在我看来,你应该保留你的代码。