网站首页 > 技术文章 正文
引言
Java 8 引入了许多新特性,其中最受欢迎的莫过于 Stream API 和 Lambda 表达式。它们不仅让代码更加简洁,也极大地提升了开发效率。本文将聚焦 Java 8 中一些方便又实用的 Map 函数,通过示例代码和源码解析,带你全面掌握这些强大的工具。
一、Java 8 中的 Map 函数
Java 8 为 Map 提供了许多新的方法,这些方法极大地简化了常见的操作。以下是一些最常用的 Map 函数:
- forEach: forEach 方法用于对 Map 中的每个键值对执行给定的操作。
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
map.forEach((key, value) -> System.out.println(key + ": " + value));
- computeIfAbsent: computeIfAbsent 方法在指定的键不存在时,计算并添加一个新的键值对。
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.computeIfAbsent("B", k -> 2);
System.out.println(map); // 输出: {A=1, B=2}
- computeIfPresent: computeIfPresent 方法在指定的键存在时,计算并更新其值。
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.computeIfPresent("A", (k, v) -> v + 1);
System.out.println(map); // 输出: {A=2}
- merge: merge 方法用于合并两个值,如果指定的键存在,则应用给定的函数来合并旧值和新值。
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.merge("A", 2, Integer::sum);
System.out.println(map); // 输出: {A=3}
- getOrDefault: getOrDefault 方法在指定的键不存在时,返回一个默认值。
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
int value = map.getOrDefault("B", 0);
System.out.println(value); // 输出: 0
二、示例代码
以下是一个综合示例,展示了如何使用这些 Map 函数:
import java.util.HashMap;
import java.util.Map;
public class MapFunctionsExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
// forEach 示例
map.forEach((key, value) -> System.out.println(key + ": " + value));
// computeIfAbsent 示例
map.computeIfAbsent("C", k -> 3);
System.out.println("After computeIfAbsent: " + map);
// computeIfPresent 示例
map.computeIfPresent("A", (k, v) -> v + 1);
System.out.println("After computeIfPresent: " + map);
// merge 示例
map.merge("B", 3, Integer::sum);
System.out.println("After merge: " + map);
// getOrDefault 示例
int value = map.getOrDefault("D", 0);
System.out.println("Value for key 'D': " + value);
}
}
三、源码解析
在 Java 8 中,这些 Map 函数的实现主要体现在 java.util.HashMap 类中。以下是部分源码解析:
- forEach: forEach 方法遍历 Map 中的每个键值对,并对其执行给定的操作。
default void forEach(BiConsumer<? super K, ? super V> action) {
Objects.requireNonNull(action);
for (Map.Entry<K, V> entry : entrySet()) {
K k;
V v;
try {
k = entry.getKey();
v = entry.getValue();
} catch (IllegalStateException ise) {
// this usually means the entry is no longer in the map.
throw new ConcurrentModificationException(ise);
}
action.accept(k, v);
}
}
- computeIfAbsent: computeIfAbsent 方法在指定键不存在时,计算并添加一个新的键值对。
public V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
Objects.requireNonNull(mappingFunction);
V v;
if ((v = get(key)) == null) {
V newValue;
if ((newValue = mappingFunction.apply(key)) != null) {
put(key, newValue);
return newValue;
}
}
return v;
}
- computeIfPresent: computeIfPresent 方法在指定键存在时,计算并更新其值。
public V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
Objects.requireNonNull(remappingFunction);
V oldValue;
if ((oldValue = get(key)) != null) {
V newValue = remappingFunction.apply(key, oldValue);
if (newValue != null) {
put(key, newValue);
return newValue;
} else {
remove(key);
return null;
}
} else {
return null;
}
}
- merge: merge 方法用于合并两个值,如果指定键存在,则应用给定的函数来合并旧值和新值。
public V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
Objects.requireNonNull(remappingFunction);
Objects.requireNonNull(value);
V oldValue = get(key);
V newValue = (oldValue == null) ? value : remappingFunction.apply(oldValue, value);
if (newValue == null) {
remove(key);
} else {
put(key, newValue);
}
return newValue;
}
- getOrDefault: getOrDefault 方法在指定键不存在时,返回一个默认值。
public V getOrDefault(Object key, V defaultValue) {
V v;
return ((v = get(key)) != null) ? v : defaultValue;
}
四、总结
本文详细介绍了 Java 8 中一些方便又实用的 Map 函数,重点解析了 forEach、computeIfAbsent、computeIfPresent、merge 和 getOrDefault 的用法。通过示例代码和源码解析,帮助你深入理解这些函数的实现原理。在实际开发中,合理使用这些 Map 函数可以让你的代码更加简洁高效。
互动与讨论
如果你在使用 Java 8 Map 函数的过程中遇到任何问题,或者有更好的实践经验,欢迎在评论区分享你的见解和讨论。你的参与将帮助更多的开发者解决类似问题。
猜你喜欢
- 2024-11-13 一位安卓程序员入坑Flutter后整理出一份超详细的学习笔记
- 2024-11-13 真正让你明白Hive调优系列3:笛卡尔乘积,小表join大表,Mapjoin
- 2024-11-13 合并Java Stream流让你更方便的对多个集合进行整合操作
- 2024-11-13 北约、俄罗斯、乌克兰地图速记,看一遍过目不忘了
- 2024-11-13 或与腾讯地图合并?搜狗地图App下架
- 2024-11-13 两张图片怎样拼在一起?将两张图片拼在一起的几种方法介绍
- 2024-11-13 普京承认乌东两个“共和国”,战术成功战略失败,恐怕得不偿失
- 2024-11-13 印度独立后,多次在南亚称霸,为何却对斯里兰卡无可奈何
- 2024-11-13 多次采集的横断面数据,可以一次合并出断面图吗?
- 2024-11-13 百度地图与汽车业务合并,李彦宏把集度汽车预订量写入OKR
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)