【问题标题】:What is the .with() method for Map in Groovy?Groovy 中 Map 的 .with() 方法是什么?
【发布时间】:2021-03-18 01:31:15
【问题描述】:

我在一个 Groovy 项目中遇到了以下代码:

payloadDetails?.with {
    payloadDetails.ardome.material_id = testAsset.materialId.trim()
    payloadDetails.ardome.itm_id = testAsset.itemId.trim()
    payloadDetails.ardome.mob_id = testAsset.mobId.trim()
    payloadDetails.ardome.min_id = testAsset.minId.trim()
    payloadDetails.ardome.original_ardome_filename = testAsset.originalFileName.trim()
}

其中'payloadDetails'变量是下面的返回值(我假设是地图):

static Map getCreateIndexPayload(String payloadName = 'CreateIndexPayload') {
     //some code
}

所以? 是空安全运算符,但.with() 方法是什么?

看起来这是一种允许一个一个地重新分配 Map 的全部或部分值成员的方法。但是我在Map的接口文档中找不到这个.with()定义,还是Collection接口的方法?

此方法是否提供 API 文档?

【问题讨论】:

    标签: java groovy


    【解决方案1】:

    Object#with 是一个 Groovy extension method,可用于任何对象。它将闭包作为参数并返回闭包的值。 (对于返回原始对象的等效项,请使用 tap;这对于嵌套初始化很有用。)

    在这种情况下,闭包 (testAsset.originalFileName.trim()) 的值被丢弃,因此 with 只是具有对对象执行闭包的效果。

    注意withtap 方法委托 到目标(也就是说,任何赋值或方法调用都首先针对它解析),所以闭包内的payloadDetails 是不必要的并且可能是一个错误。相反,你应该可以说

    payloadDetails?.with {
      ardome.material_id = testAsset.materialId.trim()
      ardome.itm_id = testAsset.itemId.trim()
      ardome.mob_id = testAsset.mobId.trim()
      ardome.min_id = testAsset.minId.trim()
      ardome.original_ardome_filename = testAsset.originalFileName.trim()
    }
    

    或者,如果 ardome 是 POJO 而不是嵌套映射*,

    payloadDetails?.ardome?.with {
      material_id = testAsset.materialId.trim()
      itm_id = testAsset.itemId.trim()
      mob_id = testAsset.mobId.trim()
      min_id = testAsset.minId.trim()
      original_ardome_filename = testAsset.originalFileName.trim()
    }
    

    * 或者如果它是一个嵌套地图;你需要自己尝试一下

    【讨论】:

    • 非常感谢您的回复。当你说'在这种情况下,闭包的值 (testAsset.originalFileName.trim())',你的意思是'testAsset.materialId.trim()、testAsset.mobId.trim()、testAsset 的闭包的值.minId.trim(), testAsset.originalFileName.trim()',不只是最后的trim(),对吧?
    • @user1559625 闭包的值是它的返回值,如果没有使用return,它就是最后一个表达式。
    • @chrylis-cautiouslyoptimistic- 你可能还想添加一些关于 Spock 的 with 的内容,因为那是真实的 spockframework.org/spock/docs/1.3/…
    • @LeonardBrünings 很有趣,但这在代码级别似乎并不是一个真正独特的结构(尽管 Spock ASTT 可能会为此做出特殊规定);语义是相同的,因为这些断言只是委托给目标。
    • 您没有抓住重点,Spock 的with 启用了对委托的隐式断言,这在使用 Groovy 变体时不起作用。对于OP的要求,您的回答是正确的。但是,标题和标签可能会将其他人引向此处,他们会期待有关 Spock 版本的信息。
    猜你喜欢
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 2013-07-10
    • 2017-01-01
    相关资源
    最近更新 更多