// 剔除数组前为空的数据 if (this.valueList[0] === null) { let endIndex = 0 for (let index = 0; index < this.valueList.length; index++) { if (this.valueList[index] || this.valueList[index] === 0) { endIndex = index break } } this.valueList = this.valueList.slice(endIndex, this.valueList.length) } // 剔除数组后为空的数据 if (this.valueList[this.valueList.length - 1] === null) { let startIndex = 0 for (let index = 0; index < this.valueList.length; index++) { if ( this.valueList[this.valueList.length - 1 - index] || this.valueList[this.valueList.length - 1 - index] === 0 ) { startIndex = this.valueList.length - 1 - index break } } this.valueList = this.valueList.slice(0, startIndex + 1) } 优化
时间: 2024-02-24 15:53:39 浏览: 132
这段代码可以进行如下优化:
```js
// 剔除数组前为空的数据
const firstNonNullIndex = this.valueList.findIndex((value) => value !== null && value !== undefined);
if (firstNonNullIndex !== -1) {
this.valueList = this.valueList.slice(firstNonNullIndex);
}
// 剔除数组后为空的数据
const lastNonNullIndex = this.valueList
.slice()
.reverse()
.findIndex((value) => value !== null && value !== undefined);
if (lastNonNullIndex !== -1) {
this.valueList = this.valueList.slice(0, this.valueList.length - lastNonNullIndex);
}
```
这里使用了 `Array.prototype.findIndex()` 和 `Array.prototype.reverse()` 方法来查找第一个非空元素的索引和最后一个非空元素的索引,然后再进行数组的截取操作。使用这种方法可以避免使用循环,代码更加简洁易懂。
相关问题
for (Entity e : rsList) { List<String> singleRecord = new ArrayList<>(); nameList.forEach(n -> singleRecord.add(e.get(n) == null ? "" : e.get(n).toString())); if (e.getMetadata().containsKey(ChargeConst.RATE_RULE_DETAIL)) { Set<Map<String, Object>> ruleDtls = (Set<Map<String, Object>>) e.getMetadata().get(ChargeConst.RATE_RULE_DETAIL); Map<Object, Object> mergedMap = ruleDtls.stream() .flatMap(map -> map.entrySet().stream().map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey(), entry.getValue() == null ? "" : entry.getValue()))) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> newValue)); final List<String> finalSingleRecord = singleRecord; valueList.add(IntStream.range(0, finalSingleRecord.size()).mapToObj( i -> finalSingleRecord.get(i).equals("") && mergedMap.get(nameList.get(i)) != null ? mergedMap.get(nameList.get(i)).toString() : finalSingleRecord.get(i)) .collect(Collectors.toList())); continue; } valueList.add(singleRecord); }降低代码复杂度
可以将代码分解为多个方法来降低复杂度,例如:
1. 提取一个方法来处理每个实体记录,将其转换为一个 String 类型的 List。
```
private List<String> processEntity(Entity e, List<String> nameList) {
List<String> singleRecord = new ArrayList<>();
nameList.forEach(n -> singleRecord.add(e.get(n) == null ? "" : e.get(n).toString()));
if (e.getMetadata().containsKey(ChargeConst.RATE_RULE_DETAIL)) {
Set<Map<String, Object>> ruleDtls = (Set<Map<String, Object>>) e.getMetadata().get(ChargeConst.RATE_RULE_DETAIL);
Map<Object, Object> mergedMap = mergeRuleDetails(ruleDtls);
final List<String> finalSingleRecord = singleRecord;
return IntStream.range(0, finalSingleRecord.size())
.mapToObj(i -> finalSingleRecord.get(i).equals("") && mergedMap.get(nameList.get(i)) != null ? mergedMap.get(nameList.get(i)).toString() : finalSingleRecord.get(i))
.collect(Collectors.toList());
}
return singleRecord;
}
```
2. 提取一个方法来合并所有规则细节的 Map。
```
private Map<Object, Object> mergeRuleDetails(Set<Map<String, Object>> ruleDtls) {
return ruleDtls.stream()
.flatMap(map -> map.entrySet().stream()
.map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey(), entry.getValue() == null ? "" : entry.getValue())))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> newValue));
}
```
3. 将原来的主方法进行简化,使用上面的两个方法来处理每个实体记录,并将结果添加到 valueList 中。
```
for (Entity e : rsList) {
List<String> singleRecord = processEntity(e, nameList);
valueList.add(singleRecord);
}
```
优化这段代码 int index = 3; for (Object data : dataList) { StringBuilder inner = new StringBuilder(); String excelStr = JSONObject.toJSONString(data, SerializerFeature.WriteMapNullValue); JSONObject object = JSONObject.parseObject(excelStr, Feature.OrderedField, Feature.IgnoreNotMatch); List<Object> valueList = Lists.newArrayList(object.values()); boolean bool = false; inner.append("第").append(index).append("行:"); if (Objects.isNull(valueList.get(0))) { bool = true; inner.append("手机号不能为空").append(";"); } for (int i = 1; i <= variableCount; i++) { Object obj = (valueList.size() - 1) >= (i + 1) ? valueList.get(i + 1) : null; if (Objects.isNull(obj)) { bool = true; inner.append("变量").append(i).append("不能为空").append(";"); } } if (bool) { if (inner.toString().endsWith(";")) { inner.setLength(inner.length() - 1); } if (!inner.toString().endsWith("\r\n")) { inner.append("\r\n"); } error.append(inner); } index++; }
下面是一些可能的优化建议:
1. 使用 forEach 循环代替 for 循环,可以使代码更简洁:
```java
int index = 3;
for (Object data : dataList) {
// ...
index++;
}
```
改为:
```java
int index = 3;
for (Object data : dataList) {
// ...
++index;
}
```
2. 将对象转换为 JSON 格式时,可以直接使用 `JSONObject` 的静态方法 `toJSONString`,而无需创建 StringBuilder 和使用 `SerializerFeature`:
```java
String excelStr = JSONObject.toJSONString(data);
```
3. 在解析 JSON 时,可以直接获取对象的值列表,而无需使用 `JSONObject` 的 `values` 方法和转换为列表:
```java
List<Object> valueList = new ArrayList<>(object.values());
```
4. 在判断变量是否为空时,可以使用 Java 8 的 Stream API 和 Lambda 表达式,使代码更简洁:
```java
boolean hasNull = IntStream.rangeClosed(2, variableCount + 1)
.mapToObj(valueList::get)
.anyMatch(Objects::isNull);
if (Objects.isNull(valueList.get(0)) || hasNull) {
// ...
}
```
这里使用 `IntStream.rangeClosed` 创建了一个整数流,从2到`variableCount+1`(包括边界);使用 `mapToObj` 将每个索引对应的对象转换为流中的元素;使用 `anyMatch` 判断流中是否有 null 元素。
5. 在拼接错误信息时,可以使用 `String.join` 方法代替 StringBuilder,使代码更简洁:
```java
List<String> errorMsgs = new ArrayList<>();
if (Objects.isNull(valueList.get(0)) || hasNull) {
errorMsgs.add("手机号不能为空");
}
IntStream.rangeClosed(2, variableCount + 1)
.filter(i -> Objects.isNull(valueList.get(i)))
.forEach(i -> errorMsgs.add("变量" + (i - 1) + "不能为空"));
if (!errorMsgs.isEmpty()) {
error.append("第").append(index).append("行:")
.append(String.join(";", errorMsgs)).append("\r\n");
}
```
这里使用 `IntStream.rangeClosed` 创建了一个整数流,从2到`variableCount+1`(包括边界);使用 `filter` 过滤出 null 元素;使用 `forEach` 将每个索引对应的错误信息添加到列表中。最后使用 `String.join` 将列表中的所有元素用分号连接,并拼接到错误信息中。
阅读全文