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

相关推荐
踏浪无痕1 小时前
手写一个Nacos配置中心:搞懂长轮询推送机制(附完整源码)
后端·面试·架构
用户345848285051 小时前
java除了`synchronized`关键字,还有哪些方式可以保证Java中的有序性?
后端
y***13641 小时前
【wiki知识库】07.用户管理后端SpringBoot部分
spring boot·后端·状态模式
CryptoPP1 小时前
使用 KLineChart 这个轻量级的前端图表库
服务器·开发语言·前端·windows·后端·golang
p***43482 小时前
前端路由管理
前端
过客随尘2 小时前
Spring AOP以及事务详解(一)
spring boot·后端
武子康2 小时前
大数据-167 ELK Elastic Stack(ELK) 实战:架构要点、索引与排错清单
大数据·后端·elasticsearch