Map<String, List<CustomsClearanceOutputDto>> map = list.stream().collect(Collectors.groupingBy(data -> format("{0}#{1}", data.getModel(), data.getType())));
时间: 2024-04-29 15:20:40 浏览: 149
这段代码使用了 Java 8 中的 Stream API,将一个 List 集合中的元素按照指定的规则进行分组,并生成一个 Map 对象。
具体来说,这里使用了 Collectors.groupingBy() 方法,该方法接受一个分类函数作为参数,用于将元素分为不同的组。在本例中,分类函数使用了 format() 方法,将每个元素的 "model" 和 "type" 属性拼接成一个字符串,中间用 "#" 分隔。
最终生成的 Map 对象的 key 是一个字符串,由 "model#type" 组成,value 是一个 List,包含所有符合该 key 的元素。
需要注意的是,这里使用了 String.format() 方法生成字符串,但是由于该方法存在潜在的安全风险(例如格式化字符串攻击),因此建议使用 MessageFormat.format() 或者 String.join() 等方法来拼接字符串。
相关问题
优化以下代码: private List<ErrorOutputFileVo> getErrorDataFileList(Long planId, String datasourceName, Long ruleTemplateId, String columnName, String tableName) { List<ErrorOutputFileVo> errorOutputFiles = new ArrayList<>(); // 按规则过滤taskId List<DataQualityPlanRelationEntity> dataQualityPlanRelationEntities = dataQualityPlanRelationService.relationInfoSearch(planId) .stream().filter(dataQualityPlanRelationEntity -> ruleTemplateId.equals(dataQualityPlanRelationEntity.getRuleId()) && columnName.equalsIgnoreCase(dataQualityPlanRelationEntity.getColumnName()) && tableName.equalsIgnoreCase(dataQualityPlanRelationEntity.getTableName())).collect(Collectors.toList()); if (CollectionUtil.isEmpty(dataQualityPlanRelationEntities)) { return errorOutputFiles; } Long datasourceId = getDatasourceId(datasourceName, dataQualityPlanRelationEntities); List<String> taskIds = dataQualityPlanRelationEntities.stream() .filter(relationInfo -> Objects.equals(datasourceId, relationInfo.getDatasourceId())) .map(DataQualityPlanRelationEntity::getTaskId) .map(String::valueOf).distinct() .collect(Collectors.toList()); // 获取质检结果 List<DqExecuteResult> dqExecuteResults = getDqExecuteResults(taskIds); if (CollectionUtil.isEmpty(dqExecuteResults)) { return errorOutputFiles; } for (DqExecuteResult dqExecuteResult : dqExecuteResults) { String errorOutputPath = dqExecuteResult.getErrorOutputPath(); Path path = new Path(errorOutputPath); R<List<String>> getFileResult = resourceClient.getFilesAtPath(path.toUri().getPath()); if (null != getFileResult && getFileResult.isSuccess()) { for (String currentPath : getFileResult.getData()) { if(StringUtil.isBlank(currentPath)){ continue; } String fileName = String.format("%s-%s-%s", tableName, columnName, dqExecuteResult.getTaskInstanceId()); String originFileName = new Path(currentPath).getName(); String[] originFileSplit = originFileName.split("-"); if(originFileSplit.length > 2){ fileName += String.format("%s-%s", originFileSplit[0], originFileSplit[1]); } // 将文件信息添加到列表 errorOutputFiles.add( ErrorOutputFileVo .builder() .datasourceId(datasourceId) .tableName(tableName) .fieldName(columnName) .fileName(fileName) .originFileName(originFileName) .taskDefinitionCode(dqExecuteResult.getTaskDefinitionCode()) .taskInstanceId(dqExecuteResult.getTaskInstanceId()).build()); } } } return errorOutputFiles; }
可以将代码优化为:
```
private List<ErrorOutputFileVo> getErrorDataFileList(Long planId, String datasourceName, Long ruleTemplateId, String columnName, String tableName) {
List<ErrorOutputFileVo> errorOutputFiles = new ArrayList<>();
// 按规则过滤taskId
List<DataQualityPlanRelationEntity> dataQualityPlanRelationEntities = dataQualityPlanRelationService.relationInfoSearch(planId)
.stream().filter(dataQualityPlanRelationEntity -> ruleTemplateId.equals(dataQualityPlanRelationEntity.getRuleId()) &&
columnName.equalsIgnoreCase(dataQualityPlanRelationEntity.getColumnName()) &&
tableName.equalsIgnoreCase(dataQualityPlanRelationEntity.getTableName()))
.collect(Collectors.toList());
if (CollectionUtil.isEmpty(dataQualityPlanRelationEntities)) {
return errorOutputFiles;
}
Long datasourceId = getDatasourceId(datasourceName, dataQualityPlanRelationEntities);
List<String> taskIds = dataQualityPlanRelationEntities.stream()
.filter(relationInfo -> Objects.equals(datasourceId, relationInfo.getDatasourceId()))
.map(DataQualityPlanRelationEntity::getTaskId)
.map(String::valueOf)
.distinct()
.collect(Collectors.toList());
// 获取质检结果
List<DqExecuteResult> dqExecuteResults = getDqExecuteResults(taskIds);
if (CollectionUtil.isEmpty(dqExecuteResults)) {
return errorOutputFiles;
}
for (DqExecuteResult dqExecuteResult : dqExecuteResults) {
String errorOutputPath = dqExecuteResult.getErrorOutputPath();
Path path = new Path(errorOutputPath);
R<List<String>> getFileResult = resourceClient.getFilesAtPath(path.toUri().getPath());
if (getFileResult == null || !getFileResult.isSuccess()) {
continue;
}
for (String currentPath : getFileResult.getData()) {
if (StringUtil.isBlank(currentPath)) {
continue;
}
String fileName = String.format("%s-%s-%s", tableName, columnName, dqExecuteResult.getTaskInstanceId());
String originFileName = new Path(currentPath).getName();
String[] originFileSplit = originFileName.split("-");
if (originFileSplit.length > 2) {
fileName += String.format("%s-%s", originFileSplit[0], originFileSplit[1]);
}
// 将文件信息添加到列表
errorOutputFiles.add(
ErrorOutputFileVo.builder()
.datasourceId(datasourceId)
.tableName(tableName)
.fieldName(columnName)
.fileName(fileName)
.originFileName(originFileName)
.taskDefinitionCode(dqExecuteResult.getTaskDefinitionCode())
.taskInstanceId(dqExecuteResult.getTaskInstanceId())
.build());
}
}
return errorOutputFiles;
}
```
优化点如下:
1. 将代码按逻辑块划分,提高可读性。
2. 避免 `null` 引用和空指针异常,增加代码的健壮性。
3. 删除不必要的变量赋值,使代码更加简洁。
4. 使用 `continue` 语句避免嵌套代码块,提高代码可读性。
解释@Service @RequiredArgsConstructor public class FormDataService extends ServiceImpl<FormDataMapper, FormData> { // private final CacheUtils cacheUtils; public void saveFormResult(FormData entity, Long userId) { // String formKey = entity.getFormKey(); // entity.setSerialNumber(cacheUtils.incr(StrUtil.format(FORM_RESULT_NUMBER, formKey), CommonConstants.ConstantNumber.ONE)); entity.setUserId(userId); entity.setSubmitAddress(AddressUtils.getRealAddressByIP(entity.getSubmitRequestIp())); this.save(entity); } public FormDataTableVO listFormDataTable(QueryFormResultRequest request) { List<FormData> dataEntityList; Long total; // 查询全部 if (0 == request.getCurrent()) { dataEntityList = this.list(Wrappers.<FormData>lambdaQuery().eq(FormData::getFormKey, request.getFormKey())); total = Long.valueOf(dataEntityList.size()); } else { Page<FormData> page = this.page(request.toMybatisPage(), Wrappers.<FormData>lambdaQuery().eq(FormData::getFormKey, request.getFormKey())); dataEntityList = page.getRecords(); total = page.getTotal(); } List<Map> list = dataEntityList.stream().map(item -> { Map<String, Object> originalData = item.getOriginalData(); item.setOriginalData(null); // originalData.put(BaseEntity.Fields.createTime, LocalDateTimeUtil.formatNormal(item.getCreateTime())); // originalData.put(BaseEntity.Fields.updateTime, LocalDateTimeUtil.formatNormal(item.getUpdateTime())); originalData.put(FormData.Fields.createTime, LocalDateTimeUtil.formatNormal(item.getCreateTime())); originalData.put(FormData.Fields.updateTime, LocalDateTimeUtil.formatNormal(item.getUpdateTime())); Map<String, Object> formDataMap = BeanUtil.beanToMap(item); formDataMap.putAll(originalData); return formDataMap; }).collect(Collectors.toList()); return new FormDataTableVO(list, total); } public Boolean deleteByIds(List<String> dataIdList, String formKey) { baseMapper.deleteBatchIds(dataIdList); return null; } public Boolean updateFormResult(FormData formData) { FormData data = this.getById(formData.getId()); data.setOriginalData(formData.getOriginalData()); return this.updateById(data); } }
这段代码是一个Java类,名为FormDataService。它使用了@Service注解来标记该类是一个服务类,并且继承了ServiceImpl<FormDataMapper, FormData>类。其中FormDataMapper是一个数据访问对象(DAO),FormData是一个实体类。
FormDataService类中定义了四个方法,分别是saveFormResult、listFormDataTable、deleteByIds和updateFormResult。
saveFormResult方法接收两个参数,一个是FormData类型的实体对象entity,另一个是Long类型的userId。该方法通过设置entity的属性值,然后调用save方法将entity保存到数据库中。
listFormDataTable方法接收一个QueryFormResultRequest类型的参数request,用于查询FormData数据列表。该方法通过判断request对象的current属性是否为0,来确定是查询全部数据,还是查询分页数据。然后使用lambdaQuery方法创建查询条件,查询符合条件的数据,并将其转换为一个List<Map>类型的对象返回。
deleteByIds方法接收两个参数,一个是List<String>类型的dataIdList,另一个是String类型的formKey。该方法通过调用baseMapper的deleteBatchIds方法,删除符合条件的数据。
updateFormResult方法接收一个FormData类型的参数formData,用于更新FormData数据。该方法通过调用getById方法获取到原始数据,然后将formData中的属性值复制到原始数据中,并调用updateById方法将更新后的数据保存到数据库中。
阅读全文