You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建存储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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 18:54:04