java map<String,List>判断是否有key,get(key.add(x),否则put(key,new list(){x})的新写法

在Java中,你可以通过几种方式实现这个逻辑。以下是几种常见的实现方法:

方法1:传统方式(使用 containsKey)

复制代码
Map<String, List<String>> map = new HashMap<>();

public void addValue(String key, String value) {
    if (map.containsKey(key)) {
        map.get(key).add(value);
    } else {
        List<String> newList = new ArrayList<>();
        newList.add(value);
        map.put(key, newList);
    }
}

方法2:使用 getOrDefault(Java 8+)

复制代码
Map<String, List<String>> map = new HashMap<>();

public void addValue(String key, String value) {
    List<String> list = map.getOrDefault(key, new ArrayList<>());
    list.add(value);
    map.put(key, list);
}

方法3:使用 computeIfAbsent(推荐,Java 8+)

复制代码
Map<String, List<String>> map = new HashMap<>();

public void addValue(String key, String value) {
    map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
}

方法4:使用 putIfAbsent

复制代码
Map<String, List<String>> map = new HashMap<>();

public void addValue(String key, String value) {
    map.putIfAbsent(key, new ArrayList<>());
    map.get(key).add(value);
}

完整示例

复制代码
import java.util.*;

public class MapExample {
    public static void main(String[] args) {
        // 使用方法3:computeIfAbsent(最简洁)
        Map<String, List<String>> map = new HashMap<>();
        
        addToMap(map, "fruit", "apple");
        addToMap(map, "fruit", "banana");
        addToMap(map, "vegetable", "carrot");
        addToMap(map, "fruit", "orange");
        
        System.out.println(map);
        // 输出: {vegetable=[carrot], fruit=[apple, banana, orange]}
    }
    
    // 使用 computeIfAbsent
    public static void addToMap(Map<String, List<String>> map, String key, String value) {
        map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
    }
}

针对不同类型 List 的通用方法

如果你需要处理不同类型的数据,可以使用泛型:

复制代码
public class MapUtils {
    // 通用方法
    public static <K, V> void addToListInMap(Map<K, List<V>> map, K key, V value) {
        map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
    }
    
    // 使用示例
    public static void main(String[] args) {
        Map<String, List<Integer>> intMap = new HashMap<>();
        Map<String, List<Double>> doubleMap = new HashMap<>();
        Map<String, List<Object>> objectMap = new HashMap<>();
        
        addToListInMap(intMap, "scores", 100);
        addToListInMap(doubleMap, "prices", 19.99);
        addToListInMap(objectMap, "items", "item1");
    }
}

线程安全版本

如果需要在多线程环境中使用:

复制代码
Map<String, List<String>> concurrentMap = new ConcurrentHashMap<>();

public void addValueSafely(String key, String value) {
    // 使用 ConcurrentHashMap 的 computeIfAbsent
    concurrentMap.computeIfAbsent(key, k -> 
        Collections.synchronizedList(new ArrayList<>())
    ).add(value);
}

推荐

推荐使用方法3(computeIfAbsent),因为:

  1. 代码最简洁

  2. 避免多次访问Map

  3. 性能较好

  4. 是原子操作(在多线程环境下更安全)

如果你使用的是Java 8之前的版本,可以使用方法1,虽然代码稍长,但兼容性最好。

相关推荐
要开心吖ZSH2 小时前
一文搞懂:JDK 21 虚拟线程 vs N种异步方案,到底该怎么选?
java·数据库·jdk·虚拟线程
guodingdingh7 小时前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯8 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育9 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵9 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔10 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影11 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Miao1213112 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔12 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
CRMEB系统商城13 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源