モダンジャワ動作-ダイナミックパラメータ化(2)

20385 ワード

複雑なプロセスのシンプル化
interface ApplePredicate { 
            boolean test(Apple apple);
        }

        static class AppleWeightPredicate implements ApplePredicate { 
            @Override
            public boolean test(Apple apple) {
                return apple.getWeight() > 150;
            }
        }

        static class AppleColorPredicate implements ApplePredicate { 

            @Override
            public boolean test(Apple apple) {
                return apple.getColor() == Color.GREEN;
            }
        }
            
    public static List<Apple> filter(List<Apple> inventory, Apple.ApplePredicate p) {
        List<Apple> result = new ArrayList<>();
        for (Apple apple : inventory) {
            if (p.test(apple)) {
                result.add(apple);
            }
        }
        return result;
    }
filterに新しい動作を渡すには、ApplePredicateインタフェースを実装する各クラスを定義し、インスタンス化する必要があります.これは煩わしい仕事だ.Javaは、クラス宣言とインスタンス化を同時に実行できる익명클래스(anonymous classs)という技術を提供しています.匿名クラスを使用すると、コード量を大幅に削減できます.
匿名クラス
List<Apple> filter = filter(inventory, new Apple.ApplePredicate() {
            @Override
            public boolean test(Apple apple) {
                return Color.RED.equals(apple.getColor());
            }
        });
匿名クラスを使用してインタフェースを実装する複数のクラスを宣言するプロセスを少し減らすことができます.メソッドを渡すと、最終的にオブジェクトが作成され、新しいアクションを明示的に定義する方法が実装されます.
  • 例:検証コードの試験方法
  • Ramda式の使用
            List<Apple> lamdafilter = filter(inventory, (Apple apple) -> RED.equals(apple.getColor()));
    Ramda式を使用すると、以前のコードよりもコードを簡潔にすることができ、問題をよりよく説明することができます.これによりパラメータの複雑さを解決することができる.
    リスト形式で抽象化
        public interface Predicate<T> {
            boolean test(T t);
        }
    
        public static <T> List<T> filter(List<T> list, Predicate<T> p) {
            List<T> result = new ArrayList<>();
            for (T e : list) {
                if (p.test(e)) {
                    result.add(e);
                }
            }
            return result;
        }
    これで、リストには整数や文字列など様々な値があり、フィルタリング方法を使用できます.
            List<Apple> filterlamda1 = filterlamda(inventory, (Apple apple) -> RED.equals(apple.getColor()));
            List<Integer> filterlamda = filterlamda(numbers, (Integer i) -> i % 2 == 0);
    動的パラメータ化は変化要求に適応しやすい有用なモードである.動作を負のメソッドにカプセル化し,メソッドの動作をパラメータ化する.
    Comparatorでソート
    要求として、リンゴを重量に応じてリストに並べ替えたいという要求も追加された.次に、要件を変更し、色に基づいてソートする場合があります.開発者も,変化する様々な要求に対応できる多様なソート動作の装置が必要である.
    JAva 8 Listは、sortメソッドを含む.Comparatorの動作は、以下のインタフェースを有するsortオブジェクトを使用してパラメータ化することができる.
        public interface Comparator<T> {
            int compare(T o1, T o2);
        }
       
            inventory.sort((Apple a1,Apple a2)->a1.getWeight().compareTo(a2.getWeight()));
    Runnableでコードブロックを実行
    JAVAスレッドではコードブロックを並列に実行できます.
    Runnableインタフェースを使用して、実行するコードブロックを指定できます.
    public interface Runnable{
    void run();
    }
    Runnableを使用して、さまざまなアクションをスレッドで実行できます.
    Thread t = new Thread(new Runnable(){
    public void run(){
    System.out.println("Hello world");
    }
    });
    
    ランダ食を利用する.
    Thread t = new Thread(()-> System.out.println("Hello Wordl"));
    このように表現することができます.
    結果としてCallableを返しますExecutorServiceを使用して、技術をスレッドプールに送信し、結果をFutureに保存することができる.
    public Interface Callable<V>{
     V call();
    }
    上記のコードを使用して、タスクを実行サービスにコミットできます.
    Future<String> threadName = executorService.submit(() -> Thread.currentThread().getName());