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

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

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

在 Java 中,Map 接口提供了 forEach() 方法,这个方法允许你遍历 Map 中的键值对,并对每个元素进行操作。它的使用与 Iterable 接口中的 forEach() 方法类似,唯一的区别是,Map 的 forEach() 方法接受的是一个 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 中的所有键值对。key 和 value 被传递给 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 是否替换成功(true 或 false)
replaceAll(BiFunction) 批量替换所有的值,BiFunction 处理每个键值对 无返回值

🎯 互动问题

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

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

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

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

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

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

相关推荐
猿究院_夏燊5 小时前
Spring Bean 生命周期
java·后端·spring
CCblandy7 小时前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构
我是人✓7 小时前
SpringBoot项目的五种创建方式
java·spring boot·后端
原则猫7 小时前
UDP 到底怎么实现可靠的
前端
Java后端的Ai之路7 小时前
14、ReactJS - 路由(Router)
前端·react.js·状态模式
裕晟资质规划8 小时前
三类涉密资质延续时限差异分析:军工60日与集成印制3个月的边界
java·服务器·前端·网络·安全
念念清晰8 小时前
000-OpenJDK17 源码构建:MacOS环境(M芯片)
java·后端
ShineWinsu9 小时前
对于JavaScript:JavaScript基础语法的解析
开发语言·前端·javascript·面试·web·基础语法·循环
月夏9 小时前
Vue3 转 React:18 项对照表 + 5 个必踩的坑(附 7 天上手路线)
前端
广州华水科技9 小时前
单北斗GNSS位移监测系统的应用与维护解析
前端