【问题标题】:Groovy - How to get map value with default without updating the mapGroovy - 如何在不更新地图的情况下使用默认值获取地图值
【发布时间】:2014-08-07 14:54:17
【问题描述】:

如何从映射中读取给定键的值,并提供默认值(在映射不包含指定键的条目时使用), 但不更新地图 - 这就是 get 方法的作用:

get(Object key, Object defaultValue)

在 Map 中查找给定键的项目并返回值 - 除非没有对应的条目 给定键在这种情况下将默认值添加到地图并返回 那个。

  1. Ofc 必须是一个简短的表达式
  2. 出于性能原因,在该地图上创建深层副本(以便可以更新)并使用提到的get 不是解决方案。

不同语言的等价物:

  • JavaScript:map["someKey"] || "defaultValue"
  • 斯卡拉:map.getOrElse("someKey", "defaultValue")
  • Python3:map.get("someKey", "defaultValue")

【问题讨论】:

  • 我想知道作为一个语言设计者你有什么需要让你觉得get() 方法修改底层映射是个好主意。感谢您指出这一点,我什至不知道。我想知道有多少人被这个咬过。这就像sort 对底层地图进行排序或getMonth() 从0 到11 返回值一样愚蠢... :(

标签: map groovy


【解决方案1】:

鉴于您为其他一些语言提供的示例以及您明确要求不更新地图,也许您正在寻找类似的东西......

map.someKey ?: 'default value'

请注意,如果 someKey 确实存在,但 Map 中与该键关联的值为 null、零、false 或任何根据 Groovy 真值规则评估为 false 的值,则将返回默认值,即可能是也可能不是你想要的。

更冗长的方法可能是这样的......

map.containsKey('someKey') ? map.someKey : 'default value'

【讨论】:

  • 正确但有点长。可以写更短的吗?
  • 要求不是很详细,但如果要求类似于,如果 Map 包含某个键,则返回该值,否则返回我提供的一些默认值,并且 Map 不应该被改变作为过程的一部分(这是原始问题中表达的内容),那么我不知道用更短的语法来表达它。您可以将自己的方法元编程到 Map 上,它可以完成工作并简化调用。
  • 感谢@JeffScottBrown!
【解决方案2】:

使用 Java 的 getOrDefault Map 方法(从 Java 8 开始):

map.getOrDefault("someKey", "defaultValue")

它不会向地图添加新键。

【讨论】:

    猜你喜欢
    • 2017-08-15
    • 2014-10-22
    • 1970-01-01
    • 2018-01-01
    • 2014-10-13
    • 2020-08-26
    • 2021-09-18
    相关资源
    最近更新 更多