java - 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 文档?
解决方案
Object#with
是可用于任何对象的 Groovy扩展方法。它将闭包作为参数并返回闭包的值。(对于返回原始对象的等价物,请使用tap
; 这对于嵌套初始化很有用。)
在这种情况下,闭包 ( testAsset.originalFileName.trim()
) 的值被丢弃,因此with
简单地具有对对象执行闭包的效果。
请注意,with
andtap
方法委托给目标(也就是说,任何分配或方法调用都首先针对它解决),因此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()
}
* 或者如果它是一个嵌套地图;你需要自己尝试一下
推荐阅读
- java - 刷卡刷新覆盖在 webview 中的我的网页中滚动菜单
- iphone - 找不到离子目标设备
- angular - 如何在不使用 Ionic 框架的情况下在 Angular 8 中使用cordova 文件插件
- java - 如何在 Wildfly/Thorntail 的属性文件中转义 ${...} (因此它们不会被评估为表达式)
- azure-functions - 调试Azure函数V1.0
- sql - 使用 Django 路由器进行内部连接
- firebase - Flutter:Firebase FieldValue.serverTimestamp() 到 DateTime 对象
- oracle - 如何从批处理文件执行sql文件并将输出显示到屏幕
- c++ - 使用 range-v3 进行转换
- python - 如何使用已经测试过的模型预测新数据的输出?