我们用一个具体例子带着你走一遍 5 种写法
假设表单提交了:
username = "张三"
age = "20"
hobby = "游戏"
hobby = "唱歌"
那么:
Map map = request.getParameterMap();
逻辑上内容是:
"username" → ["张三"]
"age" → ["20"]
"hobby" → ["游戏","唱歌"]
下面所有遍历都是基于这玩意。
方式一:keySet 遍历
for (String key : map.keySet()) { String[] values = map.get(key); System.out.println("key = " + key + ", value = " + Arrays.toString(values)); }
拆开理解:
map.keySet():拿到所有 key 的"集合" 比如:["username","age","hobby"]
每次循环拿一个 key
再用 map.get(key) 拿到对应的值数组
对上面的 map 来说,循环 3 次:
key = username, value = ["张三"]
key = age, value = ["20"]
key = hobby, value = ["游戏","唱歌"]
方式二:entrySet 增强 for 遍历
for (Map.Entry<String, String[]> entry : map.entrySet()) { String key = entry.getKey(); String[] values = entry.getValue(); System.out.println("key = " + key + ", value = " + Arrays.toString(values)); }
entrySet 是啥?
map.entrySet() = 所有"键值对"的集合 可以理解为一组小包: [ ("username",["张三"]), ("age",["20"]), ("hobby",["游戏","唱歌"]) ]
每次 for 拿到一个 entry,相当于拿到一组"键+值":
第一次:key=username, values=["张三"]
第二次:key=age, values=["20"]
第三次:key=hobby, values=["游戏","唱歌"]
方式三:entrySet + Iterator 遍历
Iterator<Map.Entry<String, String[]>> iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, String[]> entry = iterator.next(); String key = entry.getKey(); String[] values = entry.getValue(); System.out.println("key = " + key + ", value = " + Arrays.toString(values)); }
这其实和方式二是一个东西,只是循环写法换成了 Iterator:
方式二:增强 for
方式三:while + iterator
为啥还要学这个?
因为 Iterator 有个能力:遍历过程中可以删元素:
iterator.remove();
方式四:map.forEach(匿名内部类) 遍历
map.forEach(new BiConsumer<String, String[]>() { @Override public void accept(String k, String[] v) { System.out.println("key = " + k + ", value = " + Arrays.toString(v)); } });
含义:
forEach 是 Java 8 给 Map 加的方法
传一个"函数"(这里是匿名内部类 BiConsumer)
Map 内部会对每个键值对调用一次 accept(k,v)
其实等价于:
for (entry : map.entrySet()) { ... }
只是换成了"回调"的写法。
方式五:map.forEach(λ表达式) 遍历
map.forEach((k, v) -> { System.out.println("key = " + k + ", value = " + Arrays.toString(v)); });
这里:
(k, v) 就是每一个 key 和 value(value 是数组)
内部的 println 是对每一组键值对执行一次
对我们的 map 来说,会执行 3 次:
key = username, value = ["张三"]
key = age, value = ["20"]
key = hobby, value = ["游戏","唱歌"]