几个不错的代码瘦身优化案例
史蒂夫.乔布斯说,”复杂的终极境界是简单“,同样的优雅的代码一定是精简明了,可读性好。
使用LocalDate和LocalDateTime
LocalDate精确到日期,LocalDateTime精确到时分秒。优化前14行代码
try {SimpleDateFormat sdfDay = new SimpleDateFormat("yyyy-MM-dd");SimpleDateFormat sdfMins = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date now = new Date();String today = sdfDay.format(now);String waterStart = today + " 03:00:00";String waterEnd = today + " 04:00:00";Date waterStartTime = sdfMins.parse(waterStart);Date waterEndTime = sdfMins.parse(waterEnd);} catch (ParseException pe) {return XX;}
优化后3行代码
LocalDateTime now = LocalDateTime.now();LocalDateTime waterStart = LocalDateTime.of(now.getYear(), now.getMonth(),now.getDayOfMonth(),3,0);LocalDateTime waterEndTime =LocalDateTime.of(now.getYear(), now.getMonth(),now.getDayOfMonth(),4,0);
默认值使用Optional
优化前五行
if (null == status) {param.put("status", new ArrayList<String>());} else {param.put("status", status);}
优化后一行,使用JDK8的Optional
Optional.ofNullable(status).orElse(new ArrayList<String>());
如果是字符串可以用
StringUtils.defaultIfEmpty(status,"")
字符串累加
字符串只要不在for循环里累加,可以直接用+号,因为编译成字节码后会变成StringBuilder,如果在for循环里面用+号会生成多个StringBuilder,所以在for循环里累加最好在循环外创建StringBuilder。优化前五行
StringBuffer sblog = new StringBuffer();sblog.append("waterDriven|sellerId=");sblog.append(request.getSellerTaobaoId());sblog.append("|result=");sblog.append(isSuccess);
优化后一行
String sblog="waterDriven|sellerId="+request.getSellerTaobaoId()+"|result="+isSuccess;
以上场景用逗号和等号连接数据,使用GUAVA的Joiner更精简,可读性更好
String sblog=Joiner.on("|").withKeyValueSeparator("=").join(ImmutableMap.of("sellerId", request.getSellerTaobaoId(), "result", isSuccess))
LIST TO MAP
优化前4行
Map<String, String> AssetsMetaIdMap = Maps.newHashMap();for (AssetsInfoBO assetsInfoBO : request.getAssetsCollectionList()) {AssetsMetaIdMap.put(assetsInfoBO.getAssetMetadataId(), assetsInfoBO.getAssetMetadataId());}
优化后1行
Map<String, String> AssetsMetaIdMap = request.getAssetsCollectionList().stream().collect(Collectors.toMap(Hosting::getAssetMetadataId, Hosting::getAssetMetadataId));
如果key重复会抛出异常
Exception in thread "main" java.lang.IllegalStateException: Duplicate key 80000
减少不需要的判断
优化前5行
String requestId = null;if (null != request.getExtData()) {requestId = request.getExtDataValue(REQUEST_ID_KEY);}return requestId;
优化后1行
return request.getExtDataValue(REQUEST_ID_KEY);
去掉else
优化前5行
if (null != result && StringUtils.isNotBlank(no)) {return no;} else {throw new RuntimeException("XX");}
优化后4行
if (null != result && StringUtils.isNotBlank(no)) {return no;}throw new RuntimeException("XX");
不要返回布尔
优化前5行
if ("true".equalsIgnoreCase(value.toString())) {invoke = true;} else {invoke = false;}
优化后一行
invoke = "true".equalsIgnoreCase(value.toString());
使用级联
优化前5行
ParamBO paramBO = new ParamBO();paramBO.setId(1);paramBO.setName(”ifeve“);paramBO.setOld(7);
优化后1行
new ParamBO().withId(1).withName("ifeve").withOld(7);
END
往期精彩Spring Boot + WebSocket 实时监控异常
为什么要前后端分离?规范如何制定?
推荐一个好看的IDEA主题和图标集
Spring Boot 使用 Disruptor 做内部高性能消息队列
为什么不建议使用ON DUPLICATE KEY UPDATE?
关注后端面试那些事,回复【2022面经】
获取最新大厂Java面经