Java中減少if-else的幾種方式
有時(shí)候,代碼中充斥著大量的if-else語(yǔ)句并不是讓你的同事們完全理解的正確方式。
所以,無(wú)論你是初學(xué)者還是已經(jīng)很擅長(zhǎng)你的工作,都應(yīng)該讓你的代碼更加復(fù)雜和可讀。
你需要嘗試的第一件事是在你的代碼中去除if-else語(yǔ)句。以下是一些建議。
1: 立即返回
假設(shè)有以下的代碼:
public boolean isValid(String condition) { boolean result; if (condition != null){ if (condition.equals("hi") { result = true; } else { result = false; } } else { result= false; } return result; }
這種代碼通常用于提前返回,刪除了不必要的else。
public boolean isValid(String condition) { if (condition == null) { return false; } if (condition.equals("hi") { return true } return false; }
這種方法通常只適用于簡(jiǎn)單的結(jié)構(gòu),我們可以提前返回來(lái)消除一些不必要的if-else語(yǔ)句。
2: 枚舉
比如以下代碼:
public String getLabel(int status) { String label; if (1 == status) { label = "Padding"; } else if (2 == status) { label = "Paid"; } else if (3 == status) { label = "Success"; } else if (4 == status) { label = "Failed"; } return label; }
也許你可以說,沒有人寫這樣的代碼。但實(shí)際上,這種寫法是相當(dāng)常見的。每個(gè)公司都有這樣的代碼
這種代碼用枚舉就能解決:
@Getter @AllArgsConstructor public enum StatusLabelEnum { Padding(1, "Padding"), Paid(2, "Paid"), Success(3, "Success"), Failed(4, "Failed"), ; private int status; private String label; public static String getLabelByStatus(int status) { for (StatusLabelEnum labelEnum : StatusLabelEnum.values()) { if (labelEnum.getStatus() == status) { return labelEnum.getLabel(); } } return "Unknown"; } }
通過這種枚舉,上述代碼可以直接優(yōu)化為一行代碼:
public String getLabel(int status) { return StatusLabelEnum.getLabelByStatus(status); }
當(dāng)然正常的項(xiàng)目不是這么簡(jiǎn)單的k-v鍵值對(duì)的,還有更復(fù)雜的邏輯,如果返回值是固定的,枚舉也是一個(gè)簡(jiǎn)單的解決方案。
3: Optional 來(lái)解決if判斷
我相信你們肯定有項(xiàng)目,在這些項(xiàng)目中有一個(gè)非空的判斷,如果為空,則拋出異?;蚍祷刂?。:
public int getOrderStatus(UUID id) { Order order = getOrderById(id); if (order == null) { return 1; } else { return order.getOrderStatus(); } }
我們可以使用Optional來(lái)非常優(yōu)雅地解決它:
public int getOrderStatus(UUID id) { Order order = getOrderById(id); return Optional.ofNullable(order).map(Order::getOrderStatus).orElse(1); }
4: 數(shù)據(jù)表驅(qū)動(dòng)
表驅(qū)動(dòng)方法是一種允許您在不使用過多的if-else語(yǔ)句的情況下,在表格中查找信息的方法。
如有以下代碼:
if ("code1".equals(action)) { doAction1(); } else if ("code2".equals(action)) { doAction2(); } else if ("code3".equals(action)) { doAction3(); } else if ("code4".equals(action)) { doAction4(); } else if ("code5".equals(action)) { doAction5(); }
優(yōu)化代碼:
//Definition Map<String, Function<?> action> actionMap = new HashMap<>(); action.put("code1",() -> {doAction1()}); action.put("code2",() -> {doAction2()}); action.put("code3",() -> {doAction3()}); action.put("code4",() -> {doAction4()}); action.put("code5",() -> {doAction5()}); //use case actionMap.get(action).apply();
這并不是一種很好的實(shí)現(xiàn)表驅(qū)動(dòng)方法的方式,因?yàn)榇a可能會(huì)顯得非常臃腫
多實(shí)現(xiàn)類的方法優(yōu)化:
//1. Define interface public interface ActionService { void doAction(); } //2. Define implementations public class ActionService1 implements ActionService{ public void doAction() { //do something } } //3. add to table Map<String, ActionService> actionMap = new HashMap<>(); action.put("code1",new ActionService1()); action.put("code2",new ActionService2()); action.put("code3",new ActionService3()); action.put("code4",new ActionService4()); action.put("code5",new ActionService5()); //4. use it actionMap.get(action).doAction();
到此這篇關(guān)于Java中減少if-else的幾種方式的文章就介紹到這了,更多相關(guān)Java 減少if-else內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)時(shí)間控制的幾種方案
這篇文章主要介紹了java實(shí)現(xiàn)時(shí)間控制的幾種方案,本文從多個(gè)方面給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07Java Spring數(shù)據(jù)單元配置過程解析
這篇文章主要介紹了Java Spring數(shù)據(jù)單元配置過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)原理解析
這篇文章主要介紹了JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08springboot+dubbo實(shí)現(xiàn)時(shí)間輪算法
時(shí)間輪是一種高效利用線程資源進(jìn)行批量化調(diào)度的算法,本文主要介紹了springboot+dubbo實(shí)現(xiàn)時(shí)間輪算法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04SpringBoot+websocket實(shí)現(xiàn)消息對(duì)話功能
WebSocket是一種在Web應(yīng)用程序中實(shí)現(xiàn)實(shí)時(shí)雙向通信的技術(shù),它可以用于在線游戲、在線聊天、推送通知、實(shí)時(shí)監(jiān)控等,并且比傳統(tǒng)的輪詢技術(shù)更加高效和可靠,本文就給大家介紹基于SpringBoot+websocket實(shí)現(xiàn)消息對(duì)話功能,感興趣的小伙伴可以自己動(dòng)手試一試2023-09-09Spring + Mybatis 項(xiàng)目實(shí)現(xiàn)動(dòng)態(tài)切換數(shù)據(jù)源實(shí)例詳解
這篇文章主要介紹了Spring + Mybatis 項(xiàng)目實(shí)現(xiàn)動(dòng)態(tài)切換數(shù)據(jù)源的相關(guān)資料,需要的朋友參考下吧2017-04-04