public boolean updateWight(List<String> list) { ArrayList<Tag> objects = Lists.newArrayList(); for (int i = 0; i < list.size(); i++) { Tag tag = new Tag(); tag.setId(list.get(i)); tag.setWeight(i); objects.add(tag); } return this.updateBatchById(objects); }
时间: 2023-05-23 14:01:29 浏览: 56
这是一段 Java 代码,它定义了一个 public boolean 类型的方法名叫 updateWeight,方法参数是一个 List<String> 类型的列表。在方法内部,它创建了一个 ArrayList<Tag> 类型的对象实例,然后对列表中的每个元素进行循环处理,在循环体内部,针对每个元素创建了一个 Tag 对象,并设置了它的 id 和 weight 属性值,然后将该 Tag 对象添加到 ArrayList 中。最后,在方法结束前,它调用了 this.updateBatchById 方法来更新指定 ID 的对象。
相关问题
代码如下,模板类字段是动态的,怎么改造代码: setResponseHeader("项目工单统计-工单统计工单位置", response); //表头 List<List<String>> header = new ArrayList<>(); header.add(Lists.newArrayList("位置", "一级位置")); header.add(Lists.newArrayList("位置", "二级位置")); header.add(Lists.newArrayList("位置", "三级位置")); header.add(Lists.newArrayList("工单总数", "工单总数")); header.add(Lists.newArrayList("进行中工单数", "进行中工单数")); header.add(Lists.newArrayList("已挂起工单数", "已挂起工单数")); header.add(Lists.newArrayList("挂单率", "挂单率")); header.add(Lists.newArrayList("已完成工单数", "已完成工单数")); header.add(Lists.newArrayList("完成率", "完成率")); //组装导出dto List<OrderLocationAnalysisDTO> list = this.getOrderLocationAnalysisDTOList(query); List<Integer> workOrderTypeList = new ArrayList<>(); //公区报单 workOrderTypeList.add(11); WriteTable head = EasyExcel.writerTable(0).needHead(Boolean.TRUE).build(); ExcelWriter writer = EasyExcel.write(response.getOutputStream()).build(); WriteTable data = EasyExcel.writerTable(1).needHead(Boolean.TRUE).head(header).build(); WriteSheet sheet = EasyExcel.writerSheet(0).needHead(Boolean.FALSE).sheetName("工单统计工单位置导出").build(); writer.write(concatHead("工单统计工单位置导出",query.getTimeRange().getStartTime(),workOrderTypeList), sheet, head); writer.write(list,sheet,data); writer.finish();
可以将模板类字段作为参数传入方法中,然后根据参数动态生成表头。修改后的代码如下:
```
public void exportOrderLocationAnalysis(HttpServletResponse response, String sheetName, List<String> templateFields, OrderLocationAnalysisQuery query) throws IOException {
//生成表头
List<List<String>> header = new ArrayList<>();
for (String field : templateFields) {
String[] fieldArr = field.split("-");
header.add(Lists.newArrayList(fieldArr[0], fieldArr[1]));
}
//组装导出dto
List<OrderLocationAnalysisDTO> list = this.getOrderLocationAnalysisDTOList(query);
List<Integer> workOrderTypeList = new ArrayList<>();
//公区报单
workOrderTypeList.add(11);
WriteTable head = EasyExcel.writerTable(0).needHead(Boolean.TRUE).build();
ExcelWriter writer = EasyExcel.write(response.getOutputStream()).build();
WriteTable data = EasyExcel.writerTable(1).needHead(Boolean.TRUE).head(header).build();
WriteSheet sheet = EasyExcel.writerSheet(0).needHead(Boolean.FALSE).sheetName(sheetName).build();
writer.write(concatHead(sheetName, query.getTimeRange().getStartTime(), workOrderTypeList), sheet, head);
writer.write(list, sheet, data);
writer.finish();
}
```
调用该方法时,传入模板类字段的列表即可:
```
List<String> templateFields = Arrays.asList("位置-一级位置", "位置-二级位置", "位置-三级位置", "工单总数-工单总数", "进行中工单数-进行中工单数", "已挂起工单数-已挂起工单数", "挂单率-挂单率", "已完成工单数-已完成工单数", "完成率-完成率");
exportOrderLocationAnalysis(response, "工单统计工单位置导出", templateFields, query);
```
优化这段代码 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` 将列表中的所有元素用分号连接,并拼接到错误信息中。