说明
代码修复版,部分代码做了过滤处理,尽可能的表达作者的原意,持续补充。
时间的比较
问题:理解困难
找到最大的时间
if (Instant.from(createTime.atZone(ZoneId.systemDefault())).toEpochMilli() >
Instant.from(updateTime.atZone(ZoneId.systemDefault())).toEpochMilli()) {
time = createTime;
} else {
time = updateTime;
}
修复版
public LocalDateTime campareDate(LocalDateTime createTime, LocalDateTime updateTime) {
if (createTime == null) {
return updateTime;
}
if (updateTime == null) {
return createTime;
}
return createTime.compareTo(updateTime) >= 0 ? createTime : updateTime;
}
列表元素的去重
问题:可以但没必要
一番折腾之后,如果没有猜错的话,他可能是想给 list 去个重,对于基本类型来说,这样的操作是没问题。当然更推荐使用 java8 的 stream 流做去重。
set 里面元素是对象的时候,就需要重写 hashCode 与 equals 方法。否则 set 在添加元素判断的时候调用的是父类对象 object 里的 hashCode 跟 equals 方法。
点开对象,发现用的是 lombok 的注解 @Data,这个注解包含的功能太多了,一般我们使用 @Getter,@Setter,@ToString 就行了。
当然,@Data 里面也包含了@EqualsAndHashCode,只不过在特定的业务中,对象的去重逻辑还是自己定义比较好。
@Data还有另外的风险就是别人要优化你的注解,万一哪天不再使用 lombok,在没有明确标识的情况下,可能也不会去专门重写 hashCode 跟 equals 方法。
List<AppInfoDto> appInfoDtoList = appInfoOutDto.getAppInfoDtoList();
Set<AppInfoDto> appInfoDtoSet = new HashSet<>();
appInfoDtoSet.addAll(appInfoDtoList);
appInfoDtoList = new ArrayList<>();
appInfoDtoList.addAll(appInfoDtoSet);
List<AppInfoDto> appInfoDtoList = appInfoOutDto.getAppInfoDtoList();
Set<AppInfoDto> appInfoDtos = new HashSet<>(appTemplates);
直接在构造函数放入要去重的列表元素,如有需要再转回list,并且重写对象的 hashCode 与 equals 方法
跨服务查询字段回填
问题:
- 给数字0一个业务含义
- feign接口调用的判空处理
- 老问题,修改列表不用来回set
- 给对应部门code赋予部门服务查询到的name处理逻辑复杂
List<AppScopeDto> AppScopeDtos = tempLateManageMapper.queryAppScopeTemplateByCode(businessTemplateCode, 0);
List<String> deptCode = new ArrayList<>();
for (AppScopeDto AppScopeDto : AppScopeDtos) {
deptCode.add(AppScopeDto.getSalesCode());
}
Result<List<DeptDto>> authDeptDtos = depeServiceFeign.queryDeptInfoByDeptCode(deptCode);
for (int i = 0; i < AppScopeDtos.size(); i++) {
AppScopeDto AppScopeDto = AppScopeDtos.get(i);
for (DeptDto authDeptDto : authDeptDtos.getObj()) {
if (StringUtils.equals(authDeptDto.getDeptCode(), AppScopeDto.getSalesCode())) {
AppScopeDto.setDepartment(authDeptDto.getDeptName());
AppScopeDtos.set(i, AppScopeDto);
}
}
修复版
List<AppScopeDto> ScopeDto = tempLateManageMapper.
queryAppScopeTemplateByCode(businessTemplateCode, SaleTypeEnum.DEPARTMENT.getCode());
List<String> deptCodes = ScopeDto.stream().map(AppScopeDto::getSalesCode).
filter(StringUtils::isEmpty).collect(Collectors.toList());
//封装feign接口调用,增加返回值校验
List<DeptDto> authDeptDtos = queryDeptInfoByCode(deptCodes);
Map<String, String> deptDtosMap = authDeptDtos.stream().collect(Collectors.toMap(DeptDto::getDeptCode, DeptDto::getDeptName));
for (AppScopeDto scopeTemplatesOutDto : ScopeDto) {
scopeTemplatesOutDto.setDepartment(deptDtosMap.get(scopeTemplatesOutDto.getSalesCode()));
}
如果后续用到其它字段,可以把 value 替换成对象。
Map<String, Dish> dishMap = dishList.stream().collect(Collectors.toMap(Dish::getName, Function.identity()));