java8循环map_Java8遍历Map的三种⽅式——
forstreamforEach
最近写在基于Spring WebFlux项⽬遇到⼀个需求,希望将请求中的cookie/headers/params等信息获取,⽽获取后的数据结构都是MultiValueMap的数据结构,实质上可以看做是Map>这种数据结构。⽽我需要将其转换。
for循环遍历
Show me the code first!以下是代码,解释⼀下逻辑,原来的cookies数据结构为Map>,其中HttpCookie为cookie键值对,由于业务需要,我们需要将其转换成Map才更⽅便处理,于是乎就有了以下代码。(我这⾥直接⽤了foreach循环,也可以⽤fori循环,例如for(int i = 0; i< xx; i++))
MultiValueMap cookies = Cookies(); // 从request中获取原始的cookie
Map cookieMap = new HashMap<>(); // 新建⼀个map,将cookie转⼊该map中
for (Map.Entry> itemList : Set()) { // 遍历原始的MultiValueMap
for (HttpCookie item :Value()) { // 遍历每个item中的List,其中的HttpCookie是我们需要的内容
cookieMap.Name(), Value()); // 存⼊内容
}
}
复制代码
stream流的⽅式处理
在Java8中,我们可以使⽤流,将Collections或者数组转化成Stream,并⽤链式的调⽤更加逻辑更加清晰。
MultiValueMap cookies = Cookies();
Map cookieMap = new HashMap<>();
.stream() // 将其转化成流
.map(Map.Entry>::getValue) // MultiValueMap -> List
.flatMap(List::stream) // List -> HttpCookie
.forEach(cookie -> cookieMap.Name(), Value())); // 遍历,存⼊内容
复制代码
Collection具有的forEach⽅法遍历
继续⽤Stream处理
我们可以看到通过流的⽅法处理cookie的⽅法,接下来,我们接着⽤相同的⽅法来处理请求参数,请求参数原本的数据格式依然为MultiValueMap,可以看做是Map>,其中请求参数名(key)对应的值(value)可能为多⾏,我们需要将其处理成⼀⾏。
MultiValueMap params = QueryParams();
Map paramMap = new HashMap<>();
Set()
.stream() // 将Set转换为Stream
.forEach(entry ->
paramMap.put(
);
复制代码
⼤家可以看到,在处理参数值(value)的时候,值为List数据结构,以上代码通过Value().stream().collect(Collectors.joining()))将其List先转化为Stream,再⽤流的collection⽅法,将其合并。这个Collectors还具有将toSet/toList/groupingBy等功能,⼤家可以⾃⾏研究,这⾥就是使⽤的是joining合并⽅法。
存在优化点
写完后,我发现IntelliJ IDEA给我提⽰,显⽰我的代码‘不优雅’,还可以改进。IDE会对有改进空间的代码标黄,下图即为提⽰内容。
collection.stream.foreach
String.join
图⼀,事实上在Java8中Collection可以直接使⽤foreach的⽅法,⽆需转成stream再使⽤foreach⽅法。
图⼆,Java8增强了String的⽅法,可以直接使⽤String.join合并List,第⼀个参数为连接字符串的字符,我这⾥⽤的是空格" ",第⼆个参数是待连接的字符串集合。
使⽤Collection的forEach⽅法遍历Map
修改后的代码如下:
params.forEach((key, value) -> paramMap.put(key, String.join(" ", value)));
复制代码
这个时候我就想,为什么在处理例2(处理cookie的例⼦)的时候没有让我直接使⽤Collection.forEach?因为处理这个的例⼦相对复杂,使⽤了流的map/flatMap等⽅法。
总结
此时我们可以看到流的遍历Map和Collection.forEach遍历Map的区别(事实上Collection数据结构都可以使⽤以上⽅法):流的⽅法更加灵活,根据业务需要可以使⽤map/flatMap/filter/reduce等更复杂的操作。
collection.forEach相对简单,处理简单的逻辑,⼲净利落,不拖泥带⽔。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。