(二)让一个java程序员流泪,这样做就对了

(二)让一个java程序员流泪,这样做就对了

说明

代码修复版,部分代码做了过滤处理,尽可能的表达作者的原意,持续补充。

时间的比较

问题:理解困难
找到最大的时间

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 方法

跨服务查询字段回填

问题:

  1. 给数字0一个业务含义
  2. feign接口调用的判空处理
  3. 老问题,修改列表不用来回set
  4. 给对应部门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()));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值