文章目录

jdk8新方法forEach更好的遍历map数组进行操作了。

现在先看看以前的遍历写法:

以前总结的:

String key = null;
String value = null;
for(Map.Entry<String,String> entry:map.entrySet()){
    key = entry.getKey();
    value = entry.getValue();
    System.out.println("key;"+ key+",value:"+value);
}
for(String key: map.keySet()){
    System.out.println("key:"+key);
}
for(String value:map.values()){
    System.out.println("value"+value);
}

这个进行遍历的方法将key和 value两个值分开了。

还有常用的是使用Iterator进行遍历: 1. 使用范式

Iterator<Map.Entry<String,String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()){
    Map.Entry<String,String> entry = iterator.next();
    System.out.println("key:"+entry.getKey()+",value:"+entry.getValue());
}
  1. 不适用范式 Iterator entries = map.entrySet().iterator(); while (entries.hasNext()){ Map.Entry entry = (Map.Entry)entries.next(); String key = (String)entry.getKey(); String value = (String)entry.getValue(); System.out.println("key:"+entry.getKey()+",value:"+entry.getValue()); } 该种方式看起来冗余却有其优点所在。首先,在老版本java中这是惟一遍历map的方式。另一个好处是,你可以在遍历时调用iterator.remove()来删除entries,另两个方法则不能。根据javadoc的说明,如果在for-each遍历中尝试使用此方法,结果是不可预测的。

jdk8的forEach方法:

map.forEach((k,v)->sout(k,v));
static void sout(String k,String v){
    System.out.println("forEach key:"+k);
    System.out.println("forEach value"+ v);
}

改方法直接在定义一个处理key和value的方法就可以了,方便不用特意用之前的方法。方便了很多

源码:

@Override
public void forEach(BiConsumer<? super K, ? super V> action) {
    Node<K,V>[] tab;
    if (action == null)
        throw new NullPointerException();
    if (size > 0 && (tab = table) != null) {
        int mc = modCount;
        for (int i = 0; i < tab.length; ++i) {
            for (Node<K,V> e = tab[i]; e != null; e = e.next)
                action.accept(e.key, e.value);
        }
        if (modCount != mc)
            throw new ConcurrentModificationException();
    }
}

replaceAll()方法也是遍历整个map对value进行操作改变:

@Override
public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
    Node<K,V>[] tab;
    if (function == null)
        throw new NullPointerException();
    if (size > 0 && (tab = table) != null) {
        int mc = modCount;
        for (int i = 0; i < tab.length; ++i) {
            for (Node<K,V> e = tab[i]; e != null; e = e.next) {
                e.value = function.apply(e.key, e.value);
            }
        }
        if (modCount != mc)
            throw new ConcurrentModificationException();
    }
}
map.replaceAll((k,v)->replaceA(k,v));
static String replaceA(String k,String v){
//        if(k.equals("k"))
        v=v+"value +123";
    return v;
}
结果:
{j=xue yivalue +123, k=kejivalue +123}