Map Groovy—如何在不更新映射的情况下使用默认值获取映射值

Map Groovy—如何在不更新映射的情况下使用默认值获取映射值,map,groovy,Map,Groovy,如何从映射中读取给定键的值,并提供默认值(如果映射不包含指定键的条目,则使用), 但是不更新地图-这就是get方法所做的: get(对象键,对象默认值) 在映射中查找给定键的项并返回值-除非没有该项的条目 给定键在这种情况下,将默认值添加到映射中并返回 那个 Ofc它必须是一个单一的、简短的表达式 出于性能原因,在该映射上创建一个deepcopy(以便对其进行更新)并使用前面提到的get不是一个解决方案 不同语言的等价物: JavaScript:map[“someKey”]| |“defaul

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

get(对象键,对象默认值)

在映射中查找给定键的项并返回值-除非没有该项的条目 给定键在这种情况下,将默认值添加到映射中并返回 那个

  • Ofc它必须是一个单一的、简短的表达式
  • 出于性能原因,在该映射上创建一个deepcopy(以便对其进行更新)并使用前面提到的
    get
    不是一个解决方案
  • 不同语言的等价物:

    • JavaScript:
      map[“someKey”]| |“defaultValue”
    • Scala:
      map.getOrElse(“someKey”,“defaultValue”)
    • Python3:
      map.get(“someKey”,“defaultValue”)

    考虑到您为其他一些语言提供的示例以及您明确要求不更新地图的情况,您可能正在寻找类似的内容

    map.someKey ?: 'default value'
    
    map.containsKey('someKey') ? map.someKey : 'default value'
    
    请注意,如果someKey确实存在,但与该键关联的映射中的值为null、零、false或任何根据Groovy真理规则计算为false的值,那么将返回默认值,这可能是您想要的,也可能不是您想要的

    更详细的方法可能是这样的

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

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


    它不会向地图添加新的密钥。

    正确,但有点长。可以写得更短吗?需求不是很详细,但如果需求类似,如果映射包含某个键,则返回该值,否则返回我提供的一些默认值,并且映射不应作为过程的一部分进行修改(这是在原始问题中表示的),那么,我不知道有哪种更简短的语法来表达这一点。您可以将自己的方法元编程到Map上,这样做可以简化调用。谢谢@JeffScottBrown!我想知道作为一名语言设计师,你有什么理由认为
    get()
    方法修改底层映射是个好主意。谢谢你指出这一点,我甚至都不知道。我不知道有多少人被这咬过。这就像对基础映射进行排序一样愚蠢,或者将值从
    0
    返回到
    11
    一样愚蠢:(