溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中如何減少if else的編碼方式

發(fā)布時間:2021-08-18 10:57:04 來源:億速云 閱讀:590 作者:小新 欄目:編程語言

這篇文章主要介紹了java中如何減少if else的編碼方式,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

方式一 : 提前return

首先展示一段代碼示例 :

if (condition1) {
  if (condition2) {
    return getSomething();
  } else {
    return 0;
  }
} else {
  return 0;
}

修改后的代碼如下 :

//這里最好對這個flag所判斷的邏輯補充注釋進行描述
boolean flag = !condition1 || (condition1 && !condition2)
if(flag) {
 return 0;
}

if (condition1 && condition2) {
  return getSomething();
}

如果存在已知在某些條件下 , 需要返回固定值的邏輯 , 可以將這部分邏輯抽取為一個獨立的 if-else block  , 并置于其他if-else block的前面 , 當符合該特定條件時 , 直接提前 return  固定值 . 這種方式最直接的效果就是降低if-else的嵌套數(shù)量 .

方式二 : 使用三目運算符

先上例子 , 這里以一個業(yè)務場景為例 :

查詢某條評論的圖片URL列表 (如果有 , 評論的圖片url列表以JSON數(shù)組字符串格式保存在評論表中)

修改前的代碼如下 :

Comment comment = getById(commentId);

if (Objects.isNull(comment)) {
  throw new RuntimeException("評論不存在或已被刪除");
}

String imgListStr = comment.getImgList();
if(StringUtils.isEmpty(imgListStr)) {
  return null;
}

return JSON.parseArray(imgListStr, String.class);

修改后 :

Comment comment = getById(commentId);

if (Objects.isNull(comment)) {
  throw new RuntimeException("評論不存在或已被刪除");
}

String imgListStr = comment.getImgList();
return StringUtils.isEmpty(imgListStr)) ?
  null : JSON.parseArray(imgListStr, String.class);

方式三 : 使用Assert斷言

在編寫業(yè)務代碼過程中 , 如果需要對某些特定的條件進行判斷 , 且當條件不滿足時需要拋出異常 . 對于這種場景 , 除了使用上面三目運算符的示例當中的if方式 , 還可以通過使用Spring Framework 給我們提供的 Assert  工具類進行 .
其中常用的API 有 :

  • isTrue(boolean expression , String message) : 當expressio == false時 , 會拋出異常 , 異常的message則為第二個入?yún)?;

  • void notNull(@Nullable Object object, String message) : 同上 , 當object == null 時 , 會拋出異常;

  • void notEmpty(@Nullable Collection<?> collection, String message) : 同上 , 當集合對象為null或者集合元素為空時 , 會拋出異常 .

  • .....

還有其他較多方法 , 可以直接看源碼的解析 , 當然實際上isTrue() 已經(jīng)夠用了 , 如果需要更加的語義化 , 可以使用對應的API .

修改前代碼 :

if (Objects.isNull(comment)) {
  throw new RuntimeException("評論不存在或已被刪除");
}

修改后代碼 :

 Assert.isTrue(Objects.nonNull(comment),"評論不存在或已被刪除");
 Assert.notNull(comment,"評論不存在或已被刪除");

目前Assert工具方法只能拋出單一一種異常 java.lang.IllegalArgumentException , 如果需要自定義所拋出的異常 , 則該方式不適用 .

方式四 : 使用Optional

Optional是 java8 的新特性 , 相當于一個對象的容器 , 主要用于對象的null值校驗 , 以及在進行校驗后可鏈式地進行后續(xù)操作 , 如 : 拋出異常、null替換 等  .

其中我個人比較常用的幾個方法為 :

  • static <T> Optional<T> ofNullable(T value) :  使用Optional 將對象進行包裹 ;

  • T orElse(T other) :  Optional中的對象為null時 ,返回入?yún)⒌膶ο?.

  • T orElseGet(Supplier<? extends T> other) :  Optional中的對象為null時 , 返回Supplier 提供的值 ;

  • T orElseThrow(Supplier<? extends X> exceptionSupplier) :  Optional中的對象為null時 , 拋出supplier提供的自定義異常

代碼示例 :

Message message1 = Optional.ofNullable(getById(messageId))
  .orElseThrow(() -> new RuntimeException("消息不存在!"));

Message message2 = Optional.ofNullable(getById(messageId))
  .orElse(new Message());

Message message3 = Optional.ofNullable(getById(messageId))
  .orElseGet(Message::new);

由于我日常需要的進行空值判斷的比較多的場景是從數(shù)據(jù)庫查詢數(shù)據(jù)完畢時 , 需要查詢結(jié)果進行空值判斷 . 由于我所在的公司使用的持久層框架是mybatis  , 不像Spirng Boot 2.x 默認版本的JPA 那樣DAO層方法支持返回值為Optional , 所以這里如果需要使用Optional , 只能手動去使用上面列舉的第一個方法對查詢結(jié)果進行包裝 .

當然 , IDEA其實已經(jīng)給我們提供了該包裝方式的熱鍵了  , 如下圖所示 :

java中如何減少if else的編碼方式

感謝你能夠認真閱讀完這篇文章,希望小編分享的“java中如何減少if else的編碼方式”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業(yè)資訊頻道,更多相關知識等著你來學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI