首页 > 解决方案 > Groovy 中 Map 的 .with() 方法是什么?

问题描述

我在一个 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
}

null 安全运算符也是如此?,但.with()方法是什么?

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

是否有适用于此方法的 API 文档?

标签: javagroovy

解决方案


Object#with是可用于任何对象的 Groovy扩展方法。它将闭包作为参数并返回闭包的值。(对于返回原始对象的等价物,请使用tap; 这对于嵌套初始化很有用。)

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

请注意,withandtap方法委托给目标(也就是说,任何分配或方法调用都首先针对它解决),因此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()
}

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

推荐阅读