如何更简洁高效判断Map存在指定key且对应值大于0?
优化实现方案
你可以直接使用Map.get/3指定默认值实现一行判断,逻辑和原写法完全等价,更简洁且只需要一次Map查询:
if Map.get(portfolio, stock, 0) > 0 do
原写法存在的问题
原代码需要两次查询Map:第一次调用Map.has_key?/2判断键是否存在,第二次调用Map.get/2获取对应值,存在冗余的查询操作和重复代码,虽然Map是O(1)查询性能影响极小,但写法上可以大幅简化。
其他适配不同场景的写法
- 如果你习惯用Access语法,且确认持仓数值不会出现
false这类假值,也可以写成:if (portfolio[stock] || 0) > 0 do - 如果后续逻辑需要用到该持仓数值,可以用
with语句避免重复取值:with {:ok, count} <- Map.fetch(portfolio, stock), count > 0 do # 此处可直接使用count变量,无需再次查询Map end - 如果是在函数参数中做判断,可直接用模式匹配+守卫实现:
def process_portfolio(%{^stock => count}) when count > 0 do # 满足条件的业务逻辑 end def process_portfolio(_), do: # 不满足条件的兜底逻辑
内容的提问来源于stack exchange,提问作者wintermeyer
相关产品推荐
相关产品推荐

