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

相关推荐
Nan_Shu_61416 小时前
学习: Threejs (2)
前端·javascript·学习
G_G#16 小时前
纯前端js插件实现同一浏览器控制只允许打开一个标签,处理session变更问题
前端·javascript·浏览器标签页通信·只允许一个标签页
@大迁世界16 小时前
TypeScript 的本质并非类型,而是信任
开发语言·前端·javascript·typescript·ecmascript
GIS之路16 小时前
GDAL 实现矢量裁剪
前端·python·信息可视化
勇哥java实战分享16 小时前
短信平台 Pro 版本 ,比开源版本更强大
后端
是一个Bug16 小时前
后端开发者视角的前端开发面试题清单(50道)
前端
Amumu1213816 小时前
React面向组件编程
开发语言·前端·javascript
学历真的很重要16 小时前
LangChain V1.0 Context Engineering(上下文工程)详细指南
人工智能·后端·学习·语言模型·面试·职场和发展·langchain
计算机毕设VX:Fegn089516 小时前
计算机毕业设计|基于springboot + vue二手家电管理系统(源码+数据库+文档)
vue.js·spring boot·后端·课程设计
上进小菜猪17 小时前
基于 YOLOv8 的智能杂草检测识别实战 [目标检测完整源码]
后端