常见的 Java8 遍历 Map 的三种方式
for循环stream流的方式处理forEach方法遍历
转载
Show me the code first! 以下是代码,解释一下逻辑,原来的 cookies 数据结构为 Map<String, List<HttpCookie>> , 其中 HttpCookie 为 cookie 键值对,由于业务需要,我们需要将其转换成 Map<String, String> 才更方便处理,于是乎就有了以下代码。(我这里直接用了 foreach 循环,也可以用 fori 循环,例如 for(int i = 0; i< xx; i++) )
# for 循环遍历
1 | // 从request中获取原始的cookie |
# stream 流的方式处理
在 Java8 中,我们可以使用流,将 Collections 或者数组转化成 Stream ,并用链式的调用更加逻辑更加清晰。
1 | MultiValueMap<String, HttpCookie> cookies = request.getCookies(); |
# Collection 具有的 forEach 方法遍历
# 继续用 Stream 处理
我们可以看到通过流的方法处理 cookie 的方法,接下来,我们接着用相同的方法来处理请求参数,请求参数原本的数据格式依然为 MultiValueMap<String, String> ,可以看做是 Map<String, List<String>> ,其中请求参数名( key )对应的值( value )可能为多行,我们需要将其处理成一行。
1 | MultiValueMap<String, String> params = request.getQueryParams(); |
大家可以看到,在处理参数值( value )的时候,值为 List<String> 数据结构,以上代码通过 entry.getValue().stream().collect(Collectors.joining())) 将其 List 先转化为 Stream ,再用流的 collection 方法,将其合并。这个 Collectors 还具有将 toSet/toList/groupingBy 等功能,大家可以自行研究,这里就是使用的是 joining 合并方法。
# 使用 Collection 的 forEach 方法遍历 Map
修改后的代码如下:
1 | params.forEach((key, value) -> paramMap.put(key, String.join(" ", value))); |