中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Java怎么優雅地書寫if-else

發布時間:2022-08-13 09:17:12 來源:億速云 閱讀:117 作者:iii 欄目:開發技術

這篇文章主要介紹“Java怎么優雅地書寫if-else”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Java怎么優雅地書寫if-else”文章能幫助大家解決問題。

1. switch

switch方法針對枚舉值處理有不錯的效果,比如針對不同的訂單狀態時要做不同的處理,因為狀態值有限,這時我們就可以直接使用switch來針對不同狀態做不同的處理:

原語句

public void before(Integer status) {
        if(status == 1){
            System.out.println("訂單未接單");
        }else if(status == 2){
            System.out.println("訂單未發貨");
        }else if(status == 3){
            System.out.println("訂單未簽收");
        }else{
            System.out.println("訂單已簽收");
        }
    }

switch

public void greater(Integer status) {
        switch (status){
            case 1:
                System.out.println("訂單未接單");
                break;
            case 2:
                System.out.println("訂單未發貨");
                break;
            case 3:
                System.out.println("訂單未簽收");
                break;
            default:
                System.out.println("訂單已簽收");
        }
    }

總結:

switch語句適用于判斷條件有限且不需要經過復雜的計算,處理語句簡單的場景。如果我們的判斷條件需要經過一系列復雜的計算才能得到,或者處理語句邏輯也比較復雜時,我們就要考慮其他的處理方式了,畢竟在case中書寫一大堆處理語句并不算得讓人舒適的事情

2. 函數式接口

針對比較復雜的處理邏輯時,我們偏向于將這些處理邏輯單獨抽離出來,而不是還放在一個方法里處理,增加整體的可讀性和解耦性,也是我們衍生出利用函數式接口來處理if else的模式

函數式接口map處理if else的要義,是將各個條件的復雜處理邏輯單獨抽取為一個函數式接口方法,通過統一的判斷條件來調用不同的方法,具體示例如下

@Component
public class FunctionInterfaceStrategy {

    /**
     * key 方法參數,多個參數可以自定義一個實體類處理
     * value 方法返回值
     */
    private Map<Integer, Function<Object,Boolean>> operationMap;

    @PostConstruct
    private void init(){
        operationMap = new HashMap<>();
        operationMap.put(1,this::takeOrder);
        operationMap.put(2,this::sendOrder);
        operationMap.put(3,this::signOrder);
        operationMap.put(4,this::finishOrder);
    }

    public Boolean doOperation(Object params,Integer status){
        return operationMap.get(status) == null || operationMap.get(status).apply(params);
    }

    private Boolean takeOrder(Object params){
        // TODO 比較復雜的處理邏輯
        System.out.println("訂單未接單");
        return true;
    }

    private Boolean sendOrder(Object params){
        // TODO 比較復雜的處理邏輯
        System.out.println("訂單未發貨");
        return true;
    }

    private Boolean signOrder(Object params){
        // TODO 比較復雜的處理邏輯
        System.out.println("訂單未簽收");
        return true;
    }

    private Boolean finishOrder(Object params){
        // TODO 比較復雜的處理邏輯
        System.out.println("訂單已簽收");
        return true;
    }

}

調用時就不用再用if else區分了,直接傳入參數到function map中調用

   @Autowired
    private FunctionInterfaceStrategy functionInterfaceStrategy;
    
    
    functionInterfaceStrategy.doOperation("參數",1);

當然我們上述演示的是有參數有返回值的函數式接口,實際生產中我們可能還需要其他形式的函數式接口,我們將其單獨羅列出來,供大家參考使用

接口名稱說明調用方法
Supplier無參數,有返回值get
Consumer有參數,無返回值accept
Runnable無參數,無返回值run
Function有參數,有返回值apply

3. 策略模式

上述的函數式接口的形式,實際上是針對方法進行了分離,所有的實現方法還是放在了一個類里,即使你可以在FunctionInterfaceStrategy類中通過依賴注入的形式再次調用其他類的方法,但是這樣的模式,已經趨近于我們要將的下一種方法,即使用策略模式來解決 if else

策略模式的形式適用于實現方法更加復雜的情況,需要將處理邏輯解耦的更加干凈的場景

1、首先我們需要創建一個接口類,用來規定我們后續的實現類的格式

public interface OrderStrategy {

    /**
     * 獲取實現類標識
     * @return
     */
    Integer getType();

    /**
     * 邏輯處理
     * @param params
     * @return
     */
    Boolean handler(Object params);

}

2、其次針對每個判斷條件創建一個實現類

@Service
public class SendOrderStrategy implements OrderStrategy{

    @Override
    public Integer getType() {
        return 2;
    }

    @Override
    public Boolean handler(Object params) {
        // TODO 復雜的處理邏輯
        System.out.println("訂單未發貨");
        return true;
    }
}

@Service
public class SignOrderStrategy implements OrderStrategy{

    @Override
    public Integer getType() {
        return 3;
    }

    @Override
    public Boolean handler(Object params) {
        // TODO 復雜的處理邏輯
        System.out.println("訂單未簽收");
        return true;
    }
}

@Service
public class TakeOrderStrategy implements OrderStrategy{

    @Override
    public Integer getType() {
        return 1;
    }

    @Override
    public Boolean handler(Object params) {
        // TODO 復雜的處理邏輯
        System.out.println("訂單未接單");
        return true;
    }
}

3、創建一個策略工廠類,承裝實現類

@Component
@AllArgsConstructor
public class OrderStrategyFactory {

    private final List<OrderStrategy> orderStrategyList;

    private static Map<Integer,OrderStrategy> strategyMap = new HashMap<>();

    @PostConstruct
    private void init(){
        for (OrderStrategy orderStrategy : orderStrategyList) {
            strategyMap.put(orderStrategy.getType(),orderStrategy);
        }
    }

    /**
     * 執行方法
     * @param status
     * @param params
     * @return
     */
    public Boolean handler(Integer status,Object params){
        return strategyMap.get(status).handler(params);
    }

}

4、方法調用

@RestController
@RequestMapping("ifelse")
@AllArgsConstructor
public class IfElseController {

    private final OrderStrategyFactory orderStrategyFactory;

    @GetMapping("strategy")
    public Boolean strategy(Integer status){
        return orderStrategyFactory.handler(status,"1");
    }

}

總結:

通過上述的代碼示例,大家其實可以發現,函數式接口和策略模式有異曲同工之處,根本區別在于是否需要將實現方法單獨抽取為一個實現類。抽取的粒度越細也就說明解耦越強

使用策略模式,后續如果需要增加if else條件的話,只需要增加實現類即可,針對后續的處理更加方便

最終使用哪一個還需要根據具體的業務情況而定

4. 衛語句

我們經常需要在方法前處理各種參數嵌套判斷邏輯,如果不滿足條件就直接返回了,這種情況更加推薦使用衛語句來處理

原語句

    public void before(Integer status) {
        if(status != null) {
            if(status != 0){
                if(status == 1){
                    System.out.println("訂單未接單");
                }
            }
        }
    }

衛語句

    public void greater(Integer status) {
        if(status == null){
            return;
        }
        if(status != 0){
            return;
        }
        if(status == 1){
            System.out.println("訂單未接單");
        }
    }

關于“Java怎么優雅地書寫if-else”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

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

AI

凤山市| 崇州市| 穆棱市| 监利县| 信阳市| 星座| 白银市| 渭南市| 成都市| 江华| 大洼县| 米泉市| 建昌县| 绍兴市| 新宁县| 鹤庆县| 阿克苏市| 昌平区| 浦东新区| 华阴市| 遂溪县| 醴陵市| 济源市| 景德镇市| 衡南县| 哈尔滨市| 丰城市| 富锦市| 甘泉县| 东乡县| 温泉县| 宜阳县| 稷山县| 江北区| 芜湖市| 黔西县| 寿阳县| 监利县| 西昌市| 呼图壁县| 福建省|