Map遍历(for、for-each、Iterator、Collection.forEach()、stream流)

几种Map遍历操作

private  void mapTraversal(){

        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < 6; i++) {
            map.put(i,-i);
        }
        // 1、在for-each循环中遍历keys或values
        for (Integer key : map.keySet()){
            // 效率低
            int value = map.get(key);
            System.out.println(key + " : " + value);
        }
//        0 : 0
//        1 : -1
//        2 : -2
//        3 : -3
//        4 : -4
//        5 : -5
        for (Integer value:map.values()){
            System.out.println("value="+value);
        }

        // 2、在for-each循环中使用entries来遍历
        System.out.println("2、在for-each循环中使用entries来遍历:");
        for(Map.Entry<Integer, Integer> entry : map.entrySet()){
            int key = entry.getKey();
            int value = entry.getValue();
            System.out.println(key + " : " + value);
            //map.remove(entry.getKey());//报错:ConcurrentModificationException
        }

        // 3、使用迭代器Iterator
        System.out.println("3、使用迭代器Iterator:");
        Iterator<Map.Entry<Integer, Integer>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()){
            Map.Entry<Integer, Integer> entry = iterator.next();
            int key = entry.getKey();
            int value = entry.getValue();
//            iterator.remove();
            System.out.println(key + " : " + value);
        }
        // 4、不用泛型Iterator
        System.out.println("4、不用泛型Iterator:");
        Iterator iterator1 = map.entrySet().iterator();
        while (iterator1.hasNext()){
            Map.Entry entry = (Map.Entry)iterator1.next();
            int key = (int)entry.getKey();
            int value = (int)entry.getValue();
            System.out.println(key + " : " + value);
        }
        // 5、 Collection.forEach()
        System.out.println("Collection.forEach():");
        map.forEach((key, value) -> System.out.println(key + " : " + value));
//        Collection.forEach():
//        0 : 0
//        1 : -1
//        2 : -2
//        3 : -3
//        4 : -4
//        5 : -5
        // 6、 stream流操作
        System.out.println("stream流操作:");
        map.entrySet().stream()
                .filter(entry -> entry.getKey() == 5)
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))
                .forEach((key, value) -> System.out.println(key + " : " + value));
//        stream流操作:
//        5 : -5
    }

补充说明:

  1. 我们使用的增强for循环,其实是Java提供的语法糖,其实现原理是借助Iterator进行元素的遍历。但是如果在遍历过程中,不通过Iterator,而是通过集合类自身的方法对集合进行添加/删除操作。那么在Iterator进行下一次的遍历时,经检测发现有一次集合的修改操作并未通过自身进行,那么可能是发生了并发被其他线程执行的,这时候就会抛出异常,来提示用户可能发生了并发修改,这就是所谓的fail-fast机制。
    有很多种方法可以解决这类问题的。比如使用普通for循环、使用Iterator进行元素删除、使用Stream的filter、使用fail-safe的类等。

参考:https://www.cnblogs.com/baiqiantao/p/11260519.html

  1. stream流操作参考>:

https://juejin.im/post/5cc124a95188252d891d00f2#heading-7>

  1. 其他参考

https://blog.csdn.net/tjcyjd/article/details/11111401
https://www.jianshu.com/p/186bf11ffe51

你可能感兴趣的:(java学习)