几个代码瘦身优化的案例

Java技术驿站

共 3123字,需浏览 7分钟

 ·

2022-07-05 15:30

史蒂夫.乔布斯说,”复杂的终极境界是简单“,同样的优雅的代码一定是精简明了,可读性好。

使用LocalDate和LocalDateTime

LocalDate精确到日期,LocalDateTime精确到时分秒。优化前14行代码

  1. try {

  2.    SimpleDateFormat sdfDay = new SimpleDateFormat("yyyy-MM-dd");

  3.    SimpleDateFormat sdfMins = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

  4.    Date now = new Date();

  5.    String today = sdfDay.format(now);

  6.    String waterStart = today + " 03:00:00";

  7.    String waterEnd = today + " 04:00:00";

  8.    Date waterStartTime = sdfMins.parse(waterStart);

  9.    Date waterEndTime = sdfMins.parse(waterEnd);

  10. } catch (ParseException pe) {

  11.    return XX;

  12. }

优化后3行代码

  1. LocalDateTime now = LocalDateTime.now();

  2. LocalDateTime waterStart = LocalDateTime.of(now.getYear(), now.getMonth(),now.getDayOfMonth(),3,0);

  3. LocalDateTime waterEndTime =LocalDateTime.of(now.getYear(), now.getMonth(),now.getDayOfMonth(),4,0);

默认值使用Optional

优化前五行

  1. if (null == status) {

  2.    param.put("status", new ArrayList<String>());

  3. } else {

  4.    param.put("status", status);

  5. }

优化后一行,使用JDK8的Optional

  1. Optional.ofNullable(status).orElse(new ArrayList<String>());

如果是字符串可以用

  1. StringUtils.defaultIfEmpty(status,"")

字符串累加

字符串只要不在for循环里累加,可以直接用+号,因为编译成字节码后会变成StringBuilder,如果在for循环里面用+号会生成多个StringBuilder,所以在for循环里累加最好在循环外创建StringBuilder。优化前五行

  1. StringBuffer sblog = new StringBuffer();

  2. sblog.append("waterDriven|sellerId=");

  3. sblog.append(request.getSellerTaobaoId());

  4. sblog.append("|result=");

  5. sblog.append(isSuccess);

优化后一行

  1. String sblog="waterDriven|sellerId="+request.getSellerTaobaoId()+"|result="+isSuccess;

以上场景用逗号和等号连接数据,使用GUAVA的Joiner更精简,可读性更好

  1. String sblog=Joiner.on("|").withKeyValueSeparator("=").join(ImmutableMap.of("sellerId", request.getSellerTaobaoId(), "result", isSuccess))

LIST TO MAP

优化前4行

  1. Map<String, String> AssetsMetaIdMap = Maps.newHashMap();

  2. for (AssetsInfoBO assetsInfoBO : request.getAssetsCollectionList()) {

  3.    AssetsMetaIdMap.put(assetsInfoBO.getAssetMetadataId(), assetsInfoBO.getAssetMetadataId());

  4. }

优化后1行

  1. Map<String, String> AssetsMetaIdMap = request.getAssetsCollectionList().stream().collect(Collectors.toMap(Hosting::getAssetMetadataId, Hosting::getAssetMetadataId));

如果key重复会抛出异常

  1. Exception in thread "main" java.lang.IllegalStateException: Duplicate key 80000

减少不需要的判断

优化前5行

  1. String requestId = null;

  2. if (null != request.getExtData()) {

  3.    requestId = request.getExtDataValue(REQUEST_ID_KEY);

  4. }

  5. return requestId;

优化后1行

  1. return request.getExtDataValue(REQUEST_ID_KEY);

去掉else

优化前5行

  1. if (null != result &amp;&amp; StringUtils.isNotBlank(no)) {

  2.     return no;

  3. } else {

  4.     throw new RuntimeException("XX");

  5. }

优化后4行

  1. if (null != result &amp;&amp; StringUtils.isNotBlank(no)) {

  2.     return no;

  3. }

  4. throw new RuntimeException("XX");

不要返回布尔

优化前5行

  1. if ("true".equalsIgnoreCase(value.toString())) {

  2.    invoke = true;

  3. } else {

  4.    invoke = false;

  5. }

优化后一行

  1. invoke = "true".equalsIgnoreCase(value.toString());

使用级联

优化前5行

  1. ParamBO paramBO = new ParamBO();

  2. paramBO.setId(1);

  3. paramBO.setName(”ifeve“);

  4. paramBO.setOld(7);

优化后1行

  1. new ParamBO().withId(1).withName("ifeve").withOld(7);


浏览 6
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报