我有以下代码,它迭代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表达式来简化它吗
答案 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
在我看来,你应该保留你的代码。