Java 8 Map 新增方法详解

Java 8 Map 新增方法详解

1. getOrDefault

源码

	 default V getOrDefault(Object key, V defaultValue) {V v;return (((v = get(key)) != null) || containsKey(key))? v: defaultValue;}

作用:安全获取值,若key不存在则返回默认值
示例

Map<String, Integer> scores = new HashMap<>();
scores.put("Alice", 90);
System.out.println(scores.getOrDefault("Bob", 0)); // 输出 0
2. forEach

源码

    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);}}

作用:遍历Map的所有键值对
示例

Map<String, Integer> map = Map.of("A", 1, "B", 2);
map.forEach((k, v) -> System.out.println(k + ":" + v));
// 输出:
// A:1
// B:2
3. replaceAll

源码

    default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {Objects.requireNonNull(function);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);}// ise thrown from function is not a cme.v = function.apply(k, v);try {entry.setValue(v);} catch (IllegalStateException ise) {// this usually means the entry is no longer in the map.throw new ConcurrentModificationException(ise);}}}

作用:替换所有值(基于键值对的函数计算)
示例

Map<String, Integer> map = new HashMap<>();
map.put("A", 1); map.put("B", 2);
map.replaceAll((k, v) -> v * 10);
System.out.println(map); // 输出 {A=10, B=20}
4. putIfAbsent

源码

    default V putIfAbsent(K key, V value) {V v = get(key);if (v == null) {v = put(key, value);}return v;}

作用:仅当key不存在时插入值
示例

Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.putIfAbsent("A", 100); // 无效
map.putIfAbsent("B", 2);   // 成功
System.out.println(map); // 输出 {A=1, B=2}
5. remove (条件删除)

源码

    default boolean remove(Object key, Object value) {Object curValue = get(key);if (!Objects.equals(curValue, value) ||(curValue == null && !containsKey(key))) {return false;}remove(key);return true;}

作用:仅当键值匹配时才删除
示例

Map<String, String> map = new HashMap<>();
map.put("lang", "Java");
map.remove("lang", "Python"); // 失败
map.remove("lang", "Java");   // 成功
6. replace (条件替换)

源码

    default boolean replace(K key, V oldValue, V newValue) {Object curValue = get(key);if (!Objects.equals(curValue, oldValue) ||(curValue == null && !containsKey(key))) {return false;}put(key, newValue);return true;}

作用:仅当旧值匹配时才替换
示例

Map<String, String> map = new HashMap<>();
map.put("lang", "Java");
map.replace("lang", "C++", "Rust"); // 失败
map.replace("lang", "Java", "Go");   // 成功
7. replace (无条件替换)

源码

    default V replace(K key, V value) {V curValue;if (((curValue = get(key)) != null) || containsKey(key)) {curValue = put(key, value);}return curValue;}

作用:替换存在的key的值
示例

Map<String, String> map = new HashMap<>();
map.put("lang", "Java");
map.replace("lang", "Go");  // 成功
map.replace("os", "Linux"); // 无效果
8. computeIfAbsent

源码

    default 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;}

作用:key不存在时通过函数生成值
示例

Map<String, List<String>> map = new HashMap<>();
map.computeIfAbsent("fruits", k -> new ArrayList<>()).add("Apple");
System.out.println(map); // 输出 {fruits=[Apple]}

springboot源码中的

	public static SpringFactoriesLoader forResourceLocation(String resourceLocation, @Nullable ClassLoader classLoader) {Assert.hasText(resourceLocation, "'resourceLocation' must not be empty");ClassLoader resourceClassLoader = (classLoader != null ? classLoader :SpringFactoriesLoader.class.getClassLoader());Map<String, SpringFactoriesLoader> loaders = cache.computeIfAbsent(resourceClassLoader, key -> new ConcurrentReferenceHashMap<>());return loaders.computeIfAbsent(resourceLocation, key ->new SpringFactoriesLoader(classLoader, loadFactoriesResource(resourceClassLoader, resourceLocation)));}

说明
cache类型为ConcurrentReferenceHashMap

static final Map<ClassLoader, Map<String, SpringFactoriesLoader>> cache = new ConcurrentReferenceHashMap<>();

使用computeIfAbsent,查看有没有以resourceClassLoader为key的值,如果没有,则new一个ConcurrentReferenceHashMaploaders

Map<String, SpringFactoriesLoader> loaders = cache.computeIfAbsent(resourceClassLoader, key -> new ConcurrentReferenceHashMap<>());

接着看loaders中有没有以resourceLocationkey的值,没有的话,则new一个SpringFactoriesLoader并返回

9. computeIfPresent

源码

    default 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;}}

作用:key存在时通过函数计算新值
示例

Map<String, Integer> map = new HashMap<>();
map.put("count", 5);
map.computeIfPresent("count", (k, v) -> v * 2); // 变为10
map.computeIfPresent("total", (k, v) -> v + 1); // 无变化
10. compute

源码

    default V compute(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction) {Objects.requireNonNull(remappingFunction);V oldValue = get(key);V newValue = remappingFunction.apply(key, oldValue);if (newValue == null) {// delete mappingif (oldValue != null || containsKey(key)) {// something to removeremove(key);return null;} else {// nothing to do. Leave things as they were.return null;}} else {// add or replace old mappingput(key, newValue);return newValue;}}

作用:动态计算键的新值(处理存在/不存在情况)
示例

Map<String, Integer> map = new HashMap<>();
map.put("a", 2);
map.compute("a", (k, v) -> v == null ? 0 : v + 1); // a=3
map.compute("b", (k, v) -> v == null ? 0 : v + 1); // b=0
11. merge

源码

    default 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;}

作用:合并键值(处理null值)
示例

Map<String, String> map = new HashMap<>();
map.put("lang", "Java");
map.merge("lang", "Script", (oldV, newV) -> oldV + newV); // JavaScript
map.merge("new", "Key", (oldV, newV) -> oldV + newV);     // Key
12. of (创建不可变Map,这是一个重载的方法)

源码

  static <K, V> Map<K, V> of() {return (Map<K,V>) ImmutableCollections.EMPTY_MAP;}

作用:创建0-10个元素的不可变Map
示例

Map<String, Integer> empty = Map.of();
Map<String, Integer> single = Map.of("a", 1);
Map<String, Integer> multiple = Map.of("a", 1, "b", 2);
// 尝试修改会抛 UnsupportedOperationException
13. ofEntries

源码

   static <K, V> Map<K, V> ofEntries(Entry<? extends K, ? extends V>... entries) {if (entries.length == 0) { // implicit null check of entries array@SuppressWarnings("unchecked")var map = (Map<K,V>) ImmutableCollections.EMPTY_MAP;return map;} else if (entries.length == 1) {// implicit null check of the array slotreturn new ImmutableCollections.Map1<>(entries[0].getKey(),entries[0].getValue());} else {Object[] kva = new Object[entries.length << 1];int a = 0;for (Entry<? extends K, ? extends V> entry : entries) {// implicit null checks of each array slotkva[a++] = entry.getKey();kva[a++] = entry.getValue();}return new ImmutableCollections.MapN<>(kva);}}

作用:通过Entry对象创建不可变Map
示例

Map.Entry<String, Integer> e1 = Map.entry("a", 1);
Map.Entry<String, Integer> e2 = Map.entry("b", 2);
Map<String, Integer> map = Map.ofEntries(e1, e2);
14. entry

源码

    static <K, V> Entry<K, V> entry(K k, V v) {// KeyValueHolder checks for nullsreturn new KeyValueHolder<>(k, v);}

作用:创建键值对Entry对象
示例

Map.Entry<String, Integer> entry = Map.entry("key", 100);
System.out.println(entry.getKey() + ":" + entry.getValue());
15. copyOf

源码

    static <K, V> Map<K, V> copyOf(Map<? extends K, ? extends V> map) {if (map instanceof ImmutableCollections.AbstractImmutableMap) {return (Map<K,V>)map;} else {return (Map<K,V>)Map.ofEntries(map.entrySet().toArray(new Entry[0]));}}

作用:创建Map的不可变副本
示例

Map<String, Integer> original = new HashMap<>();
original.put("a", 1);
Map<String, Integer> copy = Map.copyOf(original);
// 修改original不影响copy

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/83502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

山东大学 2025 web数据管理期末复习总结

SDU-2025年-Web数据管理期末总结 考试题型 填空 &#xff1a;都来自于PPT中名词解释简答题&#xff1a;需要背一些公式。 根据L老师上课提及的重点一共总结了87问题。 文章目录 SDU-2025年-Web数据管理期末总结考试题型第1讲 绪论此章不考 第2讲 网络爬虫技术2.1 爬虫是什么…

Spring框架的设计模式

Spring 框架深度集成了多种经典设计模式&#xff0c;这些模式支撑了其核心功能&#xff08;如IoC、AOP&#xff09;的实现&#xff0c;以下是关键模式及其应用场景的梳理&#xff1a; 1、工厂模式 工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式…

git报错fatal: 远端意外挂断了

git报错fatal: 远端意外挂断了 报错详细内容 mr.mbogon tinymce % git add . mr.mbogon tinymce % git commit -m init [master c6cfc2a] init1 file changed, 2 insertions(), 1 deletion(-) mr.mengbogon tinymce % git push 枚举对象中: 241, 完成…

Windows 下安装 NVM

NVM 下载 NVM 在工作中&#xff0c;你可能遇到过某个项目需要高版本的 node 才能运行&#xff0c;而有的项目可能只支持低版本的 node&#xff0c;此时就可以借助于一些 Node 版本管理工具&#xff0c;比如 nvm&#xff08;Node Version Manager&#xff09;&#xff0c;帮助…

AI知识补全(十七):通用人工智能AGI是什么?

名人说:博观而约取,厚积而薄发。——苏轼《稼说送张琥》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:AI知识补全(十六):A2A - 谷歌开源的agent通信协议是什么? 目录 一、什么是AGI?概念解析1. 什么是AGI2. AGI与现有AI的本质区别二 、AGI的核…

Spring Cloud Gateway 介绍

什么是Spring Cloud Gateway&#xff1f; Spring Cloud Gateway 是 Spring Cloud 社区官方推出的一个基于 Spring Framework 5、Project Reactor 和 Spring Boot 2.x 的下一代 API 网关&#xff08;API Gateway&#xff09;解决方案。它旨在为微服务架构提供统一、简洁、高效的…

slam--高斯分布

教程 博主解释 高斯分布 高斯分布&#xff08;Gaussian Distribution&#xff09;&#xff0c;又称正态分布&#xff08;Normal Distribution&#xff09;&#xff0c;是描述连续型随机变量分布规律的一种概率分布。 (1) 一维高斯分布 μ&#xff1a;均值/数学期望&#xff0…

机器视觉标定讲解

B站 &#xff1a;道传科技上位机 观看教程 一、什么是相机标定 相机标定&#xff08;Camera Calibration&#xff09;是指通过实验或算法手段确定相机的内部参数&#xff08;如焦距、主点坐标、畸变系数&#xff09;和外部参数&#xff08;如旋转矩阵、平移向量&#xff0…

文件的秒传、分片上传以及断点续传 || Redis缓存减轻数据库读写压力

实现文件的秒传、分片上传以及断点续传的功能。使用 Redis 缓存上传的文件分片信息减轻数据库读写压力&#xff0c;同时防止有人恶意攻击服务器导致服务器磁盘爆满无法提供服务。 &#x1f50d; 详解&#xff1a; 1. 实现文件的秒传、分片上传以及断点续传功能 秒传&#xff0…

安全大模型智驱网络和数据安全效能跃迁

从2023年ChatGPT开始&#xff0c;网络安全行业就一直尝试和AI大模型来结合&#xff0c;解决网络安全的痛点&#xff0c;例如告警多&#xff0c;专家少&#xff0c;新的APT攻击层出不穷&#xff0c;已有的基于规则的防护手段失灵&#xff0c;如何使用大模型的泛化能力来提升对未…

Android S - 恢复部分应用安装

使用展锐提供的代码编译出来的固件&#xff0c;不包含DeskClock等应用。 之前也遇到过这个情况&#xff0c;只是时间太久忘记了&#xff0c;在这里再次记录&#xff01; frameworks/native/data/etc/android.app.remove.xml<?xml version"1.0" encoding"ut…

android 之 CALL

一、组件职责与定位 组件所在进程核心职责关键特性CallsManagerTelecom系统进程通话状态机核心&#xff1a;管理所有Call对象的生命周期&#xff08;创建、状态更新、销毁&#xff09;。监听Call状态变化并通知所有观察者&#xff08;如InCallController&#xff09;。通过mLi…

Swift 6 学习笔记(二)The Basics

这篇笔记也是同步 Swift 6 官方教程中的第二篇 《The Basics》&#xff0c;这篇博客中的大部分内容在第一篇中已经涉及&#xff0c;这篇可以被认为是基础类型的的补充篇&#xff0c;多了很多说明信息。 官方教学文档 《The Basics》&#xff1a; Swift 提供了许多基本数据类型…

【PHP】BC Math 函数参考表

BC Math 函数参考表: 函数名描述语法bcadd两个任意精度数字的加法bcadd($num1, $num2, [scale])bcsub两个任意精度数字的减法bcsub($num1, $num2, [scale])bcmul两个任意精度数字乘法bcmul($num1, $num2, [scale])bcdiv两个任意精度数字除法bcdiv($num1, $num2, [scale])bcmod…

C# TAP异步编程(Task/async/await)总结

C#中有个很好用的东西&#xff0c;TAP异步编程&#xff08;Task-based Asynchronous Pattern&#xff09;&#xff0c;是目前C#推荐的异步编程模型。它基于 System.Threading.Tasks.Task 和 async/await 关键字&#xff0c;旨在简化异步代码的编写、调试和维护。TAP 是现代 .NE…

达梦数据库(DM)用户名大小写处理规则

达梦数据库(DM)用户名大小写处理规则 达梦数据库对用户名的处理与PostgreSQL和Oracle有所不同&#xff0c;以下是相关说明&#xff1a; 一、基本规则 默认情况下&#xff1a;达梦数据库区分用户名大小写 创建的用户名会保留原始大小写格式连接时必须使用相同的大小写形式 …

黑马点评面试话术

文章目录 1.项目介绍2. 分布式登录功能2.1 讲讲登录的整个流程2.2 集群模式session下存储用户信息会有啥问题&#xff1f;2.3 为什么采用redis存储用户信息和验证码2.4 redis的存储格式怎么样的&#xff1f;2.5 为什么采用Hash结构存储用户信息2.6 为什么采用双拦截器&#xff…

MTK APEX测光系统中各变量具体的计算方式探究

目录 一、APEX测光系统介绍 二、MTK测光系统实例介绍 三、关于测光系统的一些疑问 一、APEX测光系统介绍 详细内容可以参考; AE(自动曝光)系统简介

K8S的基本概念

Kubernetes是一个开源的容器编排部署管理平台,用于管理云平台中多个主机上的容器化应用。Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了应用部署、规划、更新、维护的一种机制。 对应用开发者而言,可以把Kubernetes看成一个集群操作系统。Kubernetes…

NLP学习路线图(三十四): 命名实体识别(NER)

一、命名实体识别(NER)是什么? 命名实体识别(Named Entity Recognition, NER)是自然语言处理中的一项关键序列标注任务。其核心目标是从非结构化的文本中自动识别出特定类别的名词性短语,并将其归类到预定义的类别中。 核心目标:找到文本中提到的命名实体,并分类。 典…