目次
1. switch
より複雑な処理ロジックを扱う場合、これらの処理ロジックを 1 つのメソッドで処理するのではなく、個別に分離することを好みます。全体的な読みやすさと切り離しも、私たちが導き出したパターンです。関数型インターフェースを使って if else を処理する
ホームページ Java &#&チュートリアル Java で if-else をエレガントに記述する方法

Java で if-else をエレガントに記述する方法

Apr 29, 2023 pm 10:04 PM
java if-else

1. 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 ステートメントは限定された判定条件に適しています。複雑な計算の後は、単純なステートメントでシナリオを処理する必要はありません。判定条件に複雑な計算が必要な場合や、処理文のロジックが比較的複雑な場合は、別の処理方法を検討する必要がありますが、やはりケース内に処理文を大量に記述するのは快適ではありません。 #2. 機能インターフェイス

より複雑な処理ロジックを扱う場合、これらの処理ロジックを 1 つのメソッドで処理するのではなく、個別に分離することを好みます。全体的な読みやすさと切り離しも、私たちが導き出したパターンです。関数型インターフェースを使って if else を処理する

関数型インターフェースのマップ処理 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 を使用する必要はありません。パラメータを関数マップに直接渡して呼び出します

   @Autowired
    private FunctionInterfaceStrategy functionInterfaceStrategy;
    
    
    functionInterfaceStrategy.doOperation("参数",1);
ログイン後にコピー

もちろん、上で示したとおりです。は、パラメータと戻り値を備えた関数型インターフェイスです。実際の運用では、他の形式の関数型インターフェイスも必要になる場合があります。参照用に個別にリストします。

#インターフェイス名説明メソッドの呼び出しサプライヤーパラメータなし、戻り値ありget#パラメータはありますが、戻り値はありません##accept#runFunctionパラメータがある場合は戻り値がありますapplyストラテジの形式を解決するパターンパターンは、実装メソッドがより複雑で、処理ロジックを分離する必要があるクリーンなシナリオに適しています。
#Consumer
Runnableパラメータなし、戻り値なし
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 をエレガントに記述する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの平方根 Javaの平方根 Aug 30, 2024 pm 04:26 PM

Java の平方根のガイド。ここでは、Java で平方根がどのように機能するかを、例とそのコード実装をそれぞれ示して説明します。

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Javaのアームストロング数 Javaのアームストロング数 Aug 30, 2024 pm 04:26 PM

Java のアームストロング番号に関するガイド。ここでは、Java でのアームストロング数の概要とコードの一部について説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

See all articles