分享:从Map中根据key批量获取Values的方法

代码如下:

public static <K,V> List<V> getAllFormMap(List<K> keys,Map<K,V> source) {
	List<V> values = Collections.emptyList();
	if (keys != null && !keys.isEmpty() && source != null && !source.isEmpty()) {
		values = new ArrayList<V>();
    	for (K k : keys) {
    		values.add(source.get(k));
		}
	}
	return values;
}

 

# 批量替换Map多个key的值 在Java中,有几种方法可以批量替换Map多个key的值。以下是几种常见的实现方式: ## 1. 使用循环遍历替换 最简单直接的方法是使用循环遍历需要替换的key集合: ```java Map<String, Integer> map = new HashMap<>(); map.put("a", 1); map.put("b", 2); map.put("c", 3); // 需要替换的key和新值 Map<String, Integer> replacements = new HashMap<>(); replacements.put("a", 100); replacements.put("b", 200); // 遍历替换 for (Map.Entry<String, Integer> entry : replacements.entrySet()) { map.put(entry.getKey(), entry.getValue()); // 或者使用replace确保key存在时才替换 // map.replace(entry.getKey(), entry.getValue()); } ``` ## 2. 使用Java 8的forEach方法 ```java replacements.forEach((key, value) -> map.put(key, value)); // 或者使用replace // replacements.forEach((key, value) -> map.replace(key, value)); ``` ## 3. 使用merge方法批量处理 ```java replacements.forEach((key, newValue) -> map.merge(key, newValue, (oldValue, value) -> value) ); ``` ## 4. 使用Stream API(Java 8+) ```java Map<String, Integer> updatedMap = map.entrySet().stream() .collect(Collectors.toMap( Map.Entry::getKey, entry -> replacements.getOrDefault(entry.getKey(), entry.getValue()) )); // 如果需要修改原map而不是创建新map map.clear(); map.putAll(updatedMap); ``` ## 5. 使用Guava库(如果项目中使用) ```java import com.google.common.collect.Maps; Map<String, Integer> map = Maps.newHashMap(); map.put("a", 1); map.put("b", 2); map.put("c", 3); Map<String, Integer> replacements = Maps.newHashMap(); replacements.put("a", 100); replacements.put("b", 200); // 使用transformValues方法(但这是创建视图而非真正替换) // 真正替换还是需要遍历 replacements.forEach(map::put); ``` ## 6. 完整示例代码 ```java import java.util.HashMap; import java.util.Map; public class BatchReplaceExample { public static void main(String[] args) { // 原始map Map<String, Integer> originalMap = new HashMap<>(); originalMap.put("apple", 10); originalMap.put("banana", 20); originalMap.put("orange", 30); // 要替换的值 Map<String, Integer> replacements = new HashMap<>(); replacements.put("apple", 100); replacements.put("banana", 200); replacements.put("grape", 50); // 这个key在原map中不存在 System.out.println("替换前: " + originalMap); // 方法1: 简单遍历替换 replacements.forEach(originalMap::put); System.out.println("简单遍历替换后: " + originalMap); // 重置map originalMap.put("apple", 10); originalMap.put("banana", 20); originalMap.put("orange", 30); // 方法2: 只替换存在的key replacements.forEach((k, v) -> { if (originalMap.containsKey(k)) { originalMap.put(k, v); } }); System.out.println("只替换存在的key: " + originalMap); // 重置map originalMap.put("apple", 10); originalMap.put("banana", 20); originalMap.put("orange", 30); // 方法3: 使用merge方法 replacements.forEach((k, v) -> originalMap.merge(k, v, (oldVal, newVal) -> newVal)); System.out.println("使用merge方法: " + originalMap); } } ``` ## 7. 性能考虑 - 对于少量key的替换,各种方法性能差异不大 - 对于大量key的替换: - 直接`putAll()`可能比多次`put()`更高效 - 如果只需要替换存在的key,先检查`containsKey()`可能更高效 - 在并发环境下,考虑使用`ConcurrentHashMap`和原子操作 ## 8. 线程安全版本 ```java import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; public class ConcurrentBatchReplace { public static void main(String[] args) { ConcurrentMap<String, Integer> concurrentMap = new ConcurrentHashMap<>(); concurrentMap.put("a", 1); concurrentMap.put("b", 2); concurrentMap.put("c", 3); Map<String, Integer> replacements = new HashMap<>(); replacements.put("a", 100); replacements.put("b", 200); replacements.put("d", 400); // 不存在的key // 线程安全的批量替换 replacements.forEach((k, v) -> concurrentMap.compute(k, (key, oldValue) -> oldValue == null ? concurrentMap.get(key) : v) ); System.out.println(concurrentMap); } } ``` 选择哪种方法决于具体需求,如是否需要处理不存在的key、是否需要线程安全、是否需要基于旧值计算新值等。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值