java lambdasでスイッチケースをリファクタリングする

Sudheer:

レガシーコードをリファクタリングしようとしていますが、この場合、実行するコマンドを決定するスイッチケースの巨大なブロックがあります

switch(operation)
case addition  : return add(int a, String b, String c);
case multiply  : return multiply(int a, int b);
case substract : return substract(int a, int b);

アプローチ1:ポリモーフィズムの使用

public interface Operation {
    void performOperation(int a, int b);
}

次に、使用可能な実装をマップに入力します。

Map<Key, Operation> actions = new HashMap<>();
actions.add(addition, new addOperation());
actions.add(multiply, new multiplyOperation());
actions.add(substract, new substractOperation());

その後、操作を実行する必要があるときにマップを参照できます。

このアプローチで私が抱えている問題は、多数のクラス/匿名クラスを作成する必要があることです

アプローチ2:Enumの使用

public enum MyKeyEnum {
    ADDITION {
        public void performOperation(int a, int b) {
            // Perform addition
        }
    },
    MULTIPLY {
        public void performOperation(int a, int b) {
            // Perform Multiplication
        }
    };

    public abstract void performOperation(int counter, String dataMain, String dataSub);
    }

このアプローチは実際には2つのうちの方が優れていますが、Java 8で別の例を見て、このようなものを使用したいと思います

これらはすべてパターンに従っているので、機能インターフェースとマップを使用しようとしました

final static Map<String, Supplier<IAction>> map = new HashMap<>();
static {
    map.put("add", Addition::new);
    map.put("multiply", Multiply::new);
}
public static void main(String[] args) throws Exception {
    Supplier<IAction> action = map.get("add");
    System.out.println(action.get().performAction(10,10));

    action = map.get("multiply");
    System.out.println(action.get().performAction(10,10));
}

しかし、これにも最初のアプローチの欠点があるため、Enum実装を使用したようにラムダを使用できるかどうかを確認したいと思いました。Java8で提供されている部分的な関数実装があり、これを使用したいと思いました。

BiFunction<Integer, Integer, Integer> minus = (x, y) -> x - y;
Function<Integer, Integer> subtractor = partial(minus, 10);
System.out.println(subtractor.apply(4)); // 6

BiFunctionは2つのパラメーターしか受け入れないため、次のようなTrifuctionを作成しました。

@FunctionalInterface
interface TriFunction<T, U, V, R> {
    R apply(T a, U b, V c);
}

public static <T, U, V, R> Function<V, R> partial(TriFunction<T, U, V, R> f, T x, U y) {
    return (z) -> f.apply(x, y, z);
}

これはある程度問題を解決しますが、これをマップに追加して動的に値を渡す方法を理解できません

Map<String, TriFunction<String, Integer, Integer, Operation>> map
= new HashMap<>();
飛行:

あなたはすでにそこにいます。インターフェースと同じシグネチャを持つメソッドがある場合は、次のように操作リポジトリに渡すこともできます。

Map<String, IntBinaryOperator> operations = new HashMap<>();
operations.put("add", Integer::sum);
operations.put("subtract", (a, b) -> a - b);
operations.put("multiply", (a, b) -> a * b);
//...
System.out.println(operations.get("multiply").applyAsInt(10, 20));

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ネストされたスイッチケース(Java)またはいつ(Kotlin)をリファクタリングする方法?

分類Dev

別のパッケージのJavaインターフェースをコードからリファクタリングできますか?

分類Dev

jarファイルを使用するマルチパッケージJavaプロジェクトをbashスクリプトでコンパイルする方法

分類Dev

Javaでの不要なボックス化解除-コードをリファクタリングする方法?

分類Dev

Javaスクリプトコンパイラをリファクタリングするコード

分類Dev

JavaでのSparkファイルストリーミングによるチェックポイント

分類Dev

Eclipse / Java:静的である必要があるインスタンスメソッドを検出してリファクタリングする方法は?

分類Dev

ジェネリックスと外部クラスでヘルパーメソッドをリファクタリングする方法は?(Java Android)

分類Dev

java web:キャッチされなかった例外のスタックトレースをログファイルにリダイレクトする方法は?

分類Dev

Java8ストリームでループと条件をリファクタリングする

分類Dev

Javaで例外リファクタリングをスローします

分類Dev

Android Java-try-catchをリファクタリングする方法-finallyをスローインして、すべて抽象クラス内で?

分類Dev

EclipseでJavaアプリケーションのクラスパスにXMLファイルを追加する方法

分類Dev

Javaスタイルをより機能的なscalaスタイルにリファクタリングする

分類Dev

アプリケーションをグリッド/クラスター対応にするJavaの最適なライブラリは何ですか?

分類Dev

jメーターテストスクリプトで、パフォーマンステストの応答時間をチェックするためにJavaスクリプト、カスケードスタイルシートを除外し、HTMLのみを含めるのはなぜですか?

分類Dev

Javaでジェネリックスを使用してファクトリパターンを実装する方法

分類Dev

Javaジェネリックス:JavaでFunctorインターフェースをエンコードする方法?

分類Dev

Javaで空スペースのあるJPGファイルをクロップ/トリミング

分類Dev

Java FXアプリケーションでタスク例外をキャッチする方法は?

分類Dev

デスクトップJavaアプリケーションの構成ファイルを暗号化する方法

分類Dev

カスタムリファクタリングスクリプトを作成するのに最適なJavaライブラリは何ですか?

分類Dev

リストとインターフェースでジェネリックを使用するJava

分類Dev

Java ファイにクロス オリジン リソース シェアリングを追加する方法

分類Dev

ネストされたforeachをJava8ストリームにリファクタリングする

分類Dev

インターフェイスとジェネリックを使用してJavaでボタンを描画する

分類Dev

Javaで変数のインスタンス化の複製をどのようにリファクタリングするのが最善ですか?

分類Dev

JavaサーブレットWebアプリケーションでURLを介したファイルアクセスを防止する

分類Dev

Javaジェネリック:ジェネリックインターフェイスでジェネリッククラスのIDを取得する方法は?

Related 関連記事

  1. 1

    ネストされたスイッチケース(Java)またはいつ(Kotlin)をリファクタリングする方法?

  2. 2

    別のパッケージのJavaインターフェースをコードからリファクタリングできますか?

  3. 3

    jarファイルを使用するマルチパッケージJavaプロジェクトをbashスクリプトでコンパイルする方法

  4. 4

    Javaでの不要なボックス化解除-コードをリファクタリングする方法?

  5. 5

    Javaスクリプトコンパイラをリファクタリングするコード

  6. 6

    JavaでのSparkファイルストリーミングによるチェックポイント

  7. 7

    Eclipse / Java:静的である必要があるインスタンスメソッドを検出してリファクタリングする方法は?

  8. 8

    ジェネリックスと外部クラスでヘルパーメソッドをリファクタリングする方法は?(Java Android)

  9. 9

    java web:キャッチされなかった例外のスタックトレースをログファイルにリダイレクトする方法は?

  10. 10

    Java8ストリームでループと条件をリファクタリングする

  11. 11

    Javaで例外リファクタリングをスローします

  12. 12

    Android Java-try-catchをリファクタリングする方法-finallyをスローインして、すべて抽象クラス内で?

  13. 13

    EclipseでJavaアプリケーションのクラスパスにXMLファイルを追加する方法

  14. 14

    Javaスタイルをより機能的なscalaスタイルにリファクタリングする

  15. 15

    アプリケーションをグリッド/クラスター対応にするJavaの最適なライブラリは何ですか?

  16. 16

    jメーターテストスクリプトで、パフォーマンステストの応答時間をチェックするためにJavaスクリプト、カスケードスタイルシートを除外し、HTMLのみを含めるのはなぜですか?

  17. 17

    Javaでジェネリックスを使用してファクトリパターンを実装する方法

  18. 18

    Javaジェネリックス:JavaでFunctorインターフェースをエンコードする方法?

  19. 19

    Javaで空スペースのあるJPGファイルをクロップ/トリミング

  20. 20

    Java FXアプリケーションでタスク例外をキャッチする方法は?

  21. 21

    デスクトップJavaアプリケーションの構成ファイルを暗号化する方法

  22. 22

    カスタムリファクタリングスクリプトを作成するのに最適なJavaライブラリは何ですか?

  23. 23

    リストとインターフェースでジェネリックを使用するJava

  24. 24

    Java ファイにクロス オリジン リソース シェアリングを追加する方法

  25. 25

    ネストされたforeachをJava8ストリームにリファクタリングする

  26. 26

    インターフェイスとジェネリックを使用してJavaでボタンを描画する

  27. 27

    Javaで変数のインスタンス化の複製をどのようにリファクタリングするのが最善ですか?

  28. 28

    JavaサーブレットWebアプリケーションでURLを介したファイルアクセスを防止する

  29. 29

    Javaジェネリック:ジェネリックインターフェイスでジェネリッククラスのIDを取得する方法は?

ホットタグ

アーカイブ