如何创建存储Optional的HashMap,取值返回对应值或Optional.empty且满足使用限制
问题根因
你现有实现的问题在于java.util.HashMap的get()方法在key不存在时会直接返回null,而你后续要直接对返回结果做链式Optional操作,null调用实例方法必然触发NPE。我们只需对HashMap返回的可能为null的结果做一层Optional包装再拍平即可,全程不需要用到你禁止的那些API。
修复后完整实现
import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.function.Function; class CustomMap<V> { private final Map<String, Optional<V>> map; public CustomMap() { map = new HashMap<>(); } public Optional<V> get(String key) { // 核心逻辑:将可能为null的返回值包装后拍平,永远返回非null的Optional实例 return Optional.ofNullable(map.get(key)) .flatMap(Function.identity()); } public int size() { return map.size(); } // 通用put方法,无需依赖V类型有getKey方法 public CustomMap<V> put(String key, V value) { map.put(key, Optional.ofNullable(value)); return this; } // 如果你的业务场景需要依赖V的getKey方法可以保留这个重载 public CustomMap<V> put(V item) { map.put(item.getKey(), Optional.ofNullable(item)); return this; } }
实现效果
你给出的链式调用示例可以完全正常运行:
customMap.get("John") .flatMap(x -> x.get("ModName")) .flatMap(x -> x.get("TestName")) .map(Assessment::getGrade)
只要任意一步不存在对应key,调用链就会直接返回Optional.empty(),全程不会触发空指针,也不需要你手动做任何null或者empty判断。
内容的提问来源于stack exchange,提问作者Heartless
相关产品推荐
相关产品推荐

