C# Dictionary的TryGetValue()方法在Java Map中的等效实现是什么?
C# TryGetValue 迁移Java等效实现方案
原理解释
C#的TryGetValue()核心逻辑为:尝试从字典中按指定键取值,键不存在时返回false,同时给输出参数赋值类型默认值。Java的Map没有直接同名API,可通过现有方法组合实现完全等效的逻辑。
通用兼容写法(支持所有Java版本)
该写法无版本依赖,且在业务不存储null值的场景下比先判断containsKey再取值少一次哈希查找,效率更高:
import java.util.ArrayList; import java.util.List; import java.util.Map; private static void _AddBadQualityChar(Map<String, List<String>> badQualityChars, String charString, String badQualityChar) { List<String> _badQualityChars = badQualityChars.get(charString); // 键不存在时get返回null,等效于TryGetValue返回false的情况 if (_badQualityChars == null) { _badQualityChars = new ArrayList<>(); badQualityChars.put(charString, _badQualityChars); } _badQualityChars.add(badQualityChar); }
Java 8+ 简化写法
Java 8及以上版本提供computeIfAbsent方法,原生支持「键不存在时初始化存入再返回」的逻辑,代码可大幅简化:
import java.util.ArrayList; import java.util.List; import java.util.Map; private static void _AddBadQualityChar(Map<String, List<String>> badQualityChars, String charString, String badQualityChar) { badQualityChars.computeIfAbsent(charString, k -> new ArrayList<>()) .add(badQualityChar); }
特殊场景适配
如果你的业务逻辑允许Map存储null作为有效值,此时get()返回null无法区分是键不存在还是值本身为null,可使用以下写法:
private static void _AddBadQualityChar(Map<String, List<String>> badQualityChars, String charString, String badQualityChar) { List<String> _badQualityChars; if (!badQualityChars.containsKey(charString)) { _badQualityChars = new ArrayList<>(); badQualityChars.put(charString, _badQualityChars); } else { _badQualityChars = badQualityChars.get(charString); } _badQualityChars.add(badQualityChar); }
内容的提问来源于stack exchange,提问作者Louay GOURRIDA
相关产品推荐
相关产品推荐

