Groovy中检查嵌套数据结构元素及获取key值的报错问题
Groovy检查Record列表key字段的问题解决
问题场景
有一个包含Record对象的列表test_list,每个Record包含key等字段,需要检查列表中是否存在key值为oregon_ht01的元素,并获取对应值。原代码运行时报编译错误:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: tst.groovy: 1: expecting ')', found 'key' @ line 1, column 133. e = 1684410534479, serialized key size =
报错原因
test_list定义语法错误:Record构造参数中存在带空格的名称(如serialized key size),Groovy无法识别这种无引号的空格参数名,导致语法解析失败;同时字符串类型的参数值(如nr-dev-01、oregon_ht01)未加引号,会被当作变量处理,引发额外问题。- 检查逻辑错误:原代码用
test_list.contains(keyToFind)判断,但列表元素是Record对象,不是字符串,无法直接匹配。
解决方案
1. 修正test_list的定义
给带空格的参数名加引号,字符串类型的参数值也加上引号:
test_list = [ Record( topic: 'nr-dev-01', partition: 0, offset: 10, "serialized key size": 3, "serialized value size": 873, headers: RecordHeaders(headers: [], isReadOnly: false), key: 'oregon_ht01', value: [ push_status: "SUCCESS", push_summary: [ _index: "date_io_kl", _package: "_zip", id: "tUz1", version: 1, found: "true", _source: [ Manual: [ Preamble: [ Product_name: ["@value": "Flight manual 101"], Version: ["@value": "1.0.0"], License_info: ["@value": "LICENSED COPY - February 03 2023"] ] ] ] ] ] ) ]
2. 修正key检查逻辑
遍历列表中的Record对象,检查其key属性是否匹配目标值:
def keyToFind = 'oregon_ht01' // 检查是否存在匹配的key def keyExists = test_list.any { record -> record.key == keyToFind } if (keyExists) { println("Key $keyToFind found in messages") // 获取匹配的Record及其key值 def matchedRecord = test_list.find { it.key == keyToFind } println("Matched key value: ${matchedRecord.key}") } else { println("Key $keyToFind not found in messages") }
代码说明
any()方法:遍历列表,只要有一个元素满足record.key == keyToFind就返回true,高效完成存在性检查。find()方法:返回第一个匹配条件的Record对象,可用于获取该对象的key值或其他属性。
内容的提问来源于stack exchange,提问作者Rafa S
相关产品推荐
相关产品推荐

