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。