常见的 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))); |