优化以下代码 JSONArray concatenateColumns = LoadConfig.externalReportConfigModel.getEodTag().getJSONArray("concatenateColumn"); List<String> concatenateColumnsList = IntStream.range(0, concatenateColumns.size()).mapToObj(concatenateColumns::getString).toList(); List<List<StringValue>> firstConcatenateColumn = new ArrayList<>(); List<List<StringValue>> secondConcatenateColumn = new ArrayList<>(); List<List<StringValue>> normalConcatenateColumn = new ArrayList<>(); for (String column : concatenateColumnsList) { if (concatenateColumnsList.contains("First_Leg")) { firstConcatenateColumn.add((List<StringValue>)convertValueToString(ProtobufTDSXUtils.parsToProtobufObject(tradeData.toBuilder(), column, false, null, tradeId),true)); } else if (concatenateColumnsList.contains("Second_Leg")) { secondConcatenateColumn.add((List<StringValue>)convertValueToString(ProtobufTDSXUtils.parsToProtobufObject(tradeData.toBuilder(), column, false, null, tradeId),true)); } else { normalConcatenateColumn.add((List<StringValue>)convertValueToString(ProtobufTDSXUtils.parsToProtobufObject(tradeData.toBuilder(), column, false, null, tradeId),true)); } }
时间: 2025-06-23 15:21:37 浏览: 10
<think>嗯,用户希望优化这段Java代码。让我仔细看看代码的结构和逻辑。
首先,代码从配置中获取了一个名为"concatenateColumn"的JSON数组,然后转换成字符串列表。接着定义了三个列表来存放不同类别的列数据。然后遍历每个列名,根据列名是否包含"First_Leg"或"Second_Leg"来决定添加到哪个列表。
不过,我注意到在循环里,每次迭代都在检查整个列表是否包含"First_Leg"或"Second_Leg"。这可能有问题,因为contains方法是在整个concatenateColumnsList中查找,而不是当前处理的column变量。也就是说,不管当前column是什么,只要列表中有"First_Leg",就会进入第一个条件,这显然不符合预期。用户可能想检查的是当前column是否是"First_Leg"或"Second_Leg"。
例如,假设concatenateColumnsList同时包含"First_Leg"和"Other_Column"。那么无论当前循环的column是什么,只要列表中有"First_Leg",所有列都会被添加到firstConcatenateColumn里,这显然不对。应该是根据当前column的值来判断。
所以,这个逻辑错误需要修正,将条件改为检查当前column是否是目标字符串,而不是整个列表是否包含目标字符串。这样,每个列名会被正确分类到对应的列表中。
接下来,优化点包括:
1. 避免重复代码:每次调用convertValueToString的部分重复了,可以提取出方法或变量来减少重复。
2. 使用增强for循环代替传统的for-each,可能更简洁。
3. 类型转换警告,可以添加@SuppressWarnings或者检查类型安全。
4. 提前处理配置数据,比如将列表转为Set提高查找效率,但在这里可能不适用,因为每次判断的是当前列名,所以不需要集合查找。
5. 使用Map来管理条件分支,避免多个if-else,但可能在这里情况较少,不一定需要。
6. 代码可读性,比如变量命名和方法提取。
修改后的代码应遍历每个column,根据其值选择对应的列表,然后执行相同的处理逻辑,避免重复代码。例如,将处理逻辑提取到一个方法中,然后根据条件选择目标列表。
另外,原始代码中的类型转换可能存在安全隐患,需要确保convertValueToString返回的是List<StringValue>,否则会抛出异常。如果有不确定的情况,应添加类型检查。
综上,优化后的代码应修正条件判断错误,减少重复代码,提高可读性和效率。</think>我将分步骤为您优化这段代码,主要改进点包括逻辑修正、代码复用和性能优化:
1. **修正条件判断逻辑错误**(关键问题):
```java
// 原始错误代码(检查整个列表而非当前元素)
if (concatenateColumnsList.contains("First_Leg"))
// 修正后应检查当前列名
if ("First_Leg".equals(column))
```
2. **优化后的完整代码**:
```java
JSONArray concatenateColumns = LoadConfig.externalReportConfigModel.getEodTag().getJSONArray("concatenateColumn");
List<String> columns = IntStream.range(0, concatenateColumns.size())
.mapToObj(concatenateColumns::getString)
.collect(Collectors.toList());
List<List<StringValue>> firstLegColumns = new ArrayList<>();
List<List<StringValue>> secondLegColumns = new ArrayList<>();
List<List<StringValue>> normalColumns = new ArrayList<>();
for (String column : columns) {
// 复用Protobuf对象构建过程
ProtobufTDSXUtils.ParsBuilder builder = tradeData.toBuilder();
Object protobufObj = ProtobufTDSXUtils.parsToProtobufObject(
builder, column, false, null, tradeId
);
// 统一处理转换和类型转换
@SuppressWarnings("unchecked")
List<StringValue> values = (List<StringValue>) convertValueToString(protobufObj, true);
// 优化后的条件判断
if ("First_Leg".equals(column)) {
firstLegColumns.add(values);
} else if ("Second_Leg".equals(column)) {
secondLegColumns.add(values);
} else {
normalColumns.add(values);
}
}
```
3. **主要优化点说明**:
**a. 逻辑修正**:
- 将`concatenateColumnsList.contains("First_Leg")`改为`"First_Leg".equals(column)`
- 解决原代码中错误的条件判断逻辑(原逻辑会错误地匹配整个列表而非当前元素)
**b. 代码复用**:
```java
// 提取公共的Protobuf构建过程
ProtobufTDSXUtils.ParsBuilder builder = tradeData.toBuilder();
```
**c. 类型安全**:
```java
// 集中处理类型转换并添加抑制警告注解
@SuppressWarnings("unchecked")
List<StringValue> values = (List<StringValue>) convertValueToString(...);
```
**d. 性能优化**:
- 使用`Collectors.toList()`替代`toList()`(确保返回可修改的列表)
- 复用`tradeData.toBuilder()`避免重复创建构建器
**e. 可读性提升**:
- 重命名变量:`firstConcatenateColumn` → `firstLegColumns`
- 统一缩进和代码格式
- 移除不必要的嵌套层级
4. **进一步优化建议**:
```java
// 如果需要高频次调用,可以考虑提取工具方法
private List<StringValue> processColumn(String column, TradeData tradeData) {
ProtobufTDSXUtils.ParsBuilder builder = tradeData.toBuilder();
Object protobufObj = ProtobufTDSXUtils.parsToProtobufObject(
builder, column, false, null, tradeId
);
return convertToStringValues(protobufObj);
}
// 类型安全的转换方法
@SuppressWarnings("unchecked")
private List<StringValue> convertToStringValues(Object obj) {
return (List<StringValue>) convertValueToString(obj, true);
}
```
5. **注意事项**:
- 确保`convertValueToString`始终返回`List<StringValue>`
- 如果列顺序重要,建议改用`LinkedList`
- 对空值情况建议添加防御性检查:
```java
if (concatenateColumns == null || concatenateColumns.isEmpty()) {
return Collections.emptyList();
}
```
这些优化在保持原有功能的同时,提高了代码的可读性、维护性和类型安全性,同时修正了原始代码中的逻辑错误。
阅读全文
相关推荐



















