lists.add(new ArrayList<>(list));与 lists.add(list);区别
时间: 2023-11-18 10:03:50 浏览: 76
。这两个语句的区别在于传递的参数不同。 lists.add(list) 会将 list 对象本身添加到 lists 列表中,而 lists.add(new ArrayList<>(list)) 则会先创建一个新的 ArrayList 对象,并将 list 中的元素添加到这个新的 ArrayList 中,最后将这个新的 ArrayList 对象添加到 lists 列表中。因此,如果在后续的代码中修改了 list 对象中的元素,那么使用 lists.add(list) 也会影响到 lists 列表中的对象,而使用 lists.add(new ArrayList<>(list)) 则不会受到影响。
相关问题
代码如下,模板类字段是动态的,怎么改造代码: 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);
```
java 返回ProjectCode 和PowerSeries 不存在交集的数组 List<BizPowerInstituteEnergyStatisticsDetail> lists = new ArrayList<>(); List<BizPowerInstituteEnergyStatisticsDetail> list2 = new ArrayList<>(); BizPowerInstituteEnergyStatisticsDetail pds =new BizPowerInstituteEnergyStatisticsDetail(); pds.setProjectCode("12121"); pds.setPowerSeries("测试"); pds.setHours(null); lists.add(pds); BizPowerInstituteEnergyStatisticsDetail pds1 =new BizPowerInstituteEnergyStatisticsDetail(); pds1.setProjectCode("121213"); pds1.setPowerSeries("测试2"); lists.add(pds1); BizPowerInstituteEnergyStatisticsDetail pds3 =new BizPowerInstituteEnergyStatisticsDetail(); pds3.setProjectCode("12121"); pds3.setPowerSeries("测试2"); pds3.setHours(new BigDecimal(1)); list2.add(pds3);
可以使用 Java 8 的 Stream API 来实现该需求。首先,将两个列表合并为一个列表,然后使用 filter() 方法过滤掉那些 ProjectCode 和 PowerSeries 都相同的元素,最后将结果转换为 List 类型。
示例代码如下:
```
List<BizPowerInstituteEnergyStatisticsDetail> mergedList = Stream.concat(lists.stream(), list2.stream())
.filter(p -> lists.stream().noneMatch(q -> q.getProjectCode().equals(p.getProjectCode()) && q.getPowerSeries().equals(p.getPowerSeries())))
.collect(Collectors.toList());
```
这里使用了 concat() 方法将两个列表合并为一个,然后使用 filter() 方法过滤掉那些 ProjectCode 和 PowerSeries 都相同的元素,最后使用 collect() 方法将结果转换为 List 类型。
阅读全文