Java Map遍历的“优雅”合集

提起Java中Map的遍历,很多人第一反应还是: for (Map.Entry<K,V> entry : map.entrySet()) 。但其实Map遍历藏着多种玩法,有的优雅简洁,有的性能拉满,今天咱们盘一盘这些进阶偏基础的遍历方式,告别重复又臃肿的代码~

一、先搞懂:Map遍历的核心目标

遍历Map本质是获取「键(Key)」、「值(Value)」或「键值对(Entry)」,不同场景对应不同遍历方式,先上基础准备代码:

java 复制代码
import java.util.HashMap;
import java.util.Map;

public class MapTraversalDemo {
    public static void main(String[] args) {
        Map<String, Integer> fruitPrice = new HashMap<>();
        fruitPrice.put("苹果", 10);
        fruitPrice.put("香蕉", 5);
        fruitPrice.put("橙子", 8);
        
        // 各种遍历方式写在这里~
    }
}

二、几种遍历方式的对比

1. 传统EntrySet遍历(最通用)

这是最基础也最常用的方式,支持同时获取键和值,兼容所有Java版本:

java 复制代码
// 方式1:普通for循环+EntrySet
for (Map.Entry<String, Integer> entry : fruitPrice.entrySet()) {
    String key = entry.getKey();
    Integer value = entry.getValue();
    System.out.println(key + ":" + value + "元");
}
 

2. Lambda表达式遍历(Java 8+,极简)

Java 8引入的forEach+Lambda,一行代码搞定,告别冗余:

java 复制代码
// 方式2:Lambda+forEach
fruitPrice.forEach((key, value) -> System.out.println(key + ":" + value + "元"));

3. 只遍历Key/Value(按需选择)

如果只需要键或值,不用遍历EntrySet,直接针对性获取:

java 复制代码
// 只遍历Key
for (String key : fruitPrice.keySet()) {
    System.out.println("水果:" + key);
}

// 只遍历Value
for (Integer value : fruitPrice.values()) {
    System.out.println("价格:" + value + "元");
}

4. 迭代器遍历(支持删除元素)

如果遍历过程中需要删除元素,迭代器是安全选择(foreach遍历删除会抛异常):

java 复制代码
// 方式4:迭代器遍历(支持删除)
Iterator<Map.Entry<String, Integer>> iterator = fruitPrice.entrySet().iterator();
while (iterator.hasNext()) {
    Map.Entry<String, Integer> entry = iterator.next();
    if (entry.getValue() < 8) {
        iterator.remove(); // 安全删除价格低于8的水果
    }
}
System.out.println("删除后的Map:" + fruitPrice);

三、避坑提醒

  1. 遍历过程中修改Map(如put/remove):除了迭代器的remove方法,其他方式可能触发 ConcurrentModificationException ;

  2. 性能优先级:EntrySet遍历 > 分别遍历Key+getValue(后者会重复查询Map);

  3. Lambda遍历虽然简洁,但无法在内部使用break/continue终止遍历。

相关推荐
咩咩啃树皮7 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
阳光是sunny7 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
触底反弹7 小时前
一文搞懂 Tailwind CSS 弹性布局:从原理到实战
前端·css·html
阳光是sunny7 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
鱟鲥鳚7 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
小林ixn8 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
REDcker8 小时前
显示分辨率标准对照详解
前端·网络·分辨率·显示·屏幕
এ慕ོ冬℘゜8 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
武子康8 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
大模型码小白8 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程