254. Java 集合 - 使用 Lambda 表达式操作 Map 的值

254. Java 集合 - 使用 Lambda 表达式操作 Map 的值

1. 🛠️ 使用 forEach() 方法遍历 Map 内容

Java 中,Map 接口提供了 forEach() 方法,这个方法允许你遍历 Map 中的键值对,并对每个元素进行操作。它的使用与 Iterable 接口中的 forEach() 方法类似,唯一的区别是,MapforEach() 方法接受的是一个 BiConsumer ,而不是一个普通的 Consumer

📖 示例:遍历 Map 输出键值对

java 复制代码
import java.util.*;

public class MapForEachExample {
    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "one");
        map.put(2, "two");
        map.put(3, "three");

        // 使用 lambda 表达式遍历 Map
        map.forEach((key, value) -> System.out.println(key + " :: " + value));
    }
}

🖨️ 输出结果:

java 复制代码
1 :: one
2 :: two
3 :: three

✅ 这里,map.forEach((key, value) -> System.out.println(key + " :: " + value)) 是一个简洁 的方式来遍历 Map 中的所有键值对。keyvalue 被传递给 lambda 表达式,然后我们打印它们。


2. 🔄 替换 Map 中的值

Map 接口提供了几种替换 Map 中值的方法,允许你根据特定的条件替换绑定到键上的值。

1️⃣ 使用 replace(key, value) 替换值

这个方法是最简单的,它直接用新值替换指定键的旧值。它的行为相当于 "put-if-present" 操作。换句话说,只有当该键已存在时,才会进行替换。

java 复制代码
Map<Integer, String> map = new HashMap<>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");

// 替换键 2 对应的值
map.replace(2, "TWO");

map.forEach((key, value) -> System.out.println(key + " :: " + value));

🖨️ 输出结果:

java 复制代码
1 :: one
2 :: TWO
3 :: three

map.replace(2, "TWO")"TWO" 替换了键 2 对应的旧值 "two"


2️⃣ 使用 replace(key, oldValue, newValue) 方法进行更细粒度的控制

有时,你可能希望只有在旧值和预期值匹配时才替换replace(key, oldValue, newValue) 方法允许你实现这一需求。如果当前值与 oldValue 匹配,则替换为 newValue,否则不做操作。

java 复制代码
Map<Integer, String> map = new HashMap<>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");

// 只有当值为 "two" 时,才替换为 "TWO"
boolean result = map.replace(2, "two", "TWO");
System.out.println("Replacement successful: " + result);

map.forEach((key, value) -> System.out.println(key + " :: " + value));

🖨️ 输出结果:

java 复制代码
Replacement successful: true
1 :: one
2 :: TWO
3 :: three

✅ 这里,map.replace(2, "two", "TWO") 替换了键 2 的值,从 "two" 替换成了 "TWO",并返回了 true,表示替换成功。


3️⃣ 使用 replaceAll() 替换所有值

如果你希望批量替换 Map 中所有的值,可以使用 replaceAll() 方法。它接收一个 BiFunction,这个函数会对每个键值对进行处理,计算并返回新值来替换原有值。

📖 示例:将所有的值转换为大写字母
java 复制代码
Map<Integer, String> map = new HashMap<>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");

map.replaceAll((key, value) -> value.toUpperCase());  // 将所有值转换为大写

map.forEach((key, value) -> System.out.println(key + " :: " + value));

🖨️ 输出结果:

java 复制代码
1 :: ONE
2 :: TWO
3 :: THREE

replaceAll() 方法遍历 Map 中的每个键值对,并将每个值都转换为大写字母。


3. ⚙️ 总结:replace 系列方法

方法 功能说明 返回值
replace(key, value) 直接替换键对应的值,如果键存在,则替换,否则不做操作 被替换的旧值
replace(key, oldValue, newValue) 只有当当前值等于 oldValue 时才会替换为 newValue 是否替换成功(truefalse
replaceAll(BiFunction) 批量替换所有的值,BiFunction 处理每个键值对 无返回值

🎯 互动问题

问题1map.replace(2, "two", "TWO") 为什么返回值为 true

答案示例:因为 map.replace(2, "two", "TWO") 在键 2 的值为 "two" 时,成功地将其替换成了 "TWO",因此返回 true

问题2map.replaceAll((key, value) -> value.toUpperCase()) 中的 replaceAll 方法如何工作?

答案示例:replaceAll() 方法会遍历 Map 中的所有键值对,然后对每个值应用提供的 BiFunction,并用返回的新值替换原有值。在这个例子中,所有的值都变成了大写字母。

问题3 :如果 Map 中的键不存在,map.replace(key, value) 会发生什么?

答案示例:如果键不存在,replace(key, value) 什么也不做,原值保持不变,并且返回值为 null

相关推荐
FreeTinker5 小时前
HTML本地存储技术解析:localStorage与sessionStorage的原理、差异与应用场景
前端·html
qq_452396235 小时前
第十二篇:《全链路监控与可观测性:前端错误追踪与性能分析》
前端
2601_962055976 小时前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
wangruofeng6 小时前
Phosphor Icons 官网源码拆解:URL 即存储、水波动画与 7362 Star 图标库的架构实践
前端·架构·github
BigTopOne7 小时前
WebRTC Native / Android 开发学习资源整理
前端
Lost of 程序猿7 小时前
ASP.NET Core API 幂等性设计深度实战:从一次重复申领事故说起
后端·asp.net
excel8 小时前
nuxt 3 升级 nuxt 4 报错之 hasInjectionContext
前端
何以解忧,唯有..8 小时前
LangChain 工具调用(Tool Calling)实战指南
java·前端·langchain
QQ_21696290968 小时前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端
软件聚导航9 小时前
「聚小软 AI 助手」技术升级:从数据库检索到 RAG 知识库问答
前端·数据库·mysql·微信小程序·小程序·ai编程·rag