Java 8の動作パラメータ化による伝達コード

3915 ワード



  • Java 8の動作パラメータ化による伝達コード
    ソフトウェアエンジニアリングでは、何をしてもユーザーのニーズが変わることがよく知られています.例えば、農民が自分の在庫を知るのを助けるアプリケーションがあります.この農民は在庫の中のすべての緑色のリンゴを検索する機能を望んでいるかもしれない.しかし、翌日になると、彼はあなたに教えてくれるかもしれません.150 gを超えるアップルを探したいと思っていますが、数日後、彼はまた戻ってきて、すべての緑を見つけたいと思っています.150 gを超えるアップルを探したいと思っています.行動パラメータ化行為パラメータ化は、頻繁に変化する需要を処理するソフトウェア開発モデルです.一般的には、コードブロックを出すことです.それを準備して、実行しません.このコードブロックは後でプログラムの他の部分に呼び出され、このコードの実行を遅らせることができることを意味します.例えば、コードブロックをパラメータとして別の方法に渡し、後で実行することができ、この方法の動作はそのコードに基づいてパラメータ化される.初めてすべての色が緑のりんごを選別して、緑のりんごを新しい集合に置くことを試みました.
    public static List filterGreenApples(List inventory) {
            List result = new ArrayList<>();
            for (Apple apple : inventory) {
                if ("green".equals(apple.getColor())) {
                    result.add(apple);
                }
            }
            return result;
        }
    

    2回目は赤いりんごをフィルタリングするインタフェースを実現して、colorを抽象化して、パラメータになって伝わって、このようにあなたはどんな色の私がすべて持っています.
    public static List filterApplesByColor(List inventory, String color) {
            List result = new ArrayList<>();
            for (Apple apple : inventory) {
                if (color.equals(apple.getColor())) {
                    result.add(apple);
                }
            }
            return result;
        }
    

    3回目の試みでは、大きなりんごと小さなりんごを区別し、大きなりんごは150 gより重い.
    public static List filterApplesByWeight(List inventory, int weight) {
            List result = new ArrayList<>();
            for (Apple apple : inventory) {
                if (apple.getWeight() > weight) {
                    result.add(apple);
                }
            }
            return result;
        }
    

    4回目は緑色で150 gより重いリンゴを濾過しようとした.
    public static List filterApples(List inventory, String color, int weight,boolean flag) {
            List result = new ArrayList<>();
            for (Apple apple : inventory) {
                if ((flag &&apple.getColor().equals(color)) ||(!flag &&apple.getWeight().>weight)) {
                    result.add(apple);
                }
            }
            return result;
        }
        List greenAlpples = filterApples(inventory,"green",0,true);
        List heavyAlpples = filterApples(inventory," ",150,false);
    

    5回目の試みは、1つのインタフェースによって異なるパラメータを伝達することである.
    public interface ApplePredicate {
        boolean test(Apple apple);
    }
    
    //    
    public class AppleGreenPredicate implements ApplePredicate {
        @Override
        public boolean test(Apple apple) {
            return apple.getColor().equals("green");
        }
    }
    
    //   
    public class AppleHeavyWeightPredicate implements ApplePredicate {
        @Override
        public boolean test(Apple apple) {
            return apple.getWeight() > 150;
        }
    }
    
    //    
    public static List filterApples(List inventory, ApplePredicate p) {
            List result = new ArrayList<>();
            for (Apple apple : inventory) {
                if (p.test(apple)) {
                    result.add(apple);
                }
            }
            return result;
        }
    
    

    6回目の試みの欠点:新しい論理のたびにこのインタフェースを実現し、匿名クラスの最適化
    List greenApples = filterApples(inventory, new ApplePredicate() {
                @Override
                public boolean test(Apple apple) {
                    return apple.getColor().equals("green");
                }
            });
    

    コアコードをlambda式で渡し、
    List result = filterApples(inventory, (Apple apple) -> apple.getColor().equals("green"));
    

    タイプを外すことができます
    List result = filterApples(inventory, apple -> apple.getColor().equals("green"));