Java 8(一)のLamdaに近づく

6787 ワード

高次関数
Lamda式を理解する前に、高次関数とは何かを理解してみましょう.数学とコンピュータの分野では、高次関数は少なくとも以下の2つの条件の1つを満たす.1つ以上の関数を入力2として受け入れる.関数を出力
なぜLamdaを使うのか
Java言語だけでなくJavaScriptやScalaのようなスクリプト言語にも触れたことがあると思います.これらの言語は高次関数をサポートし、以上の2点を同時に満たすことが多いと思います.Scala言語自体はJVMに依存しているので,Java言語に対して高次関数を実現するのも全く問題ない.JDK 8ではLamda式はJavaを実現するための関数式プログラミングである.JDK 8のバージョンをあまり使っていない仲間もいるかもしれませんが、Lamda式は私たちに何をもたらすのかと思います.コードの簡略化と可読性、Lamda式にチェーン呼び出しを加えると、コードが分かりやすく見えます.あまり話さないで、まずは簡単な栗を見てみましょう~
        // JDK8     
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("thread run!!!");
            }
        }).start();
        // Lamda      
        new Thread(()->{System.out.println("thread run!!!");}).start();

コードの清潔さは明らかですが、Lamda式があれば吐き気のする匿名の内部クラスに別れを告げることができます(変数の可視性、Lamda式はどのようなものなのか、守らなければならないのかなど、匿名の内部クラスの特質を考えてみましょう)、特に何度も呼び出された場合は、チェーン呼び出しで表現することができ、より筋道と人間的です.
Lamda式インタフェースの説明方法
1.インタフェースを明示し、クラス注記@FunctionalInterfaceを追加し、インタフェースに実装されていないメソッドが1つしかないことを保証します.インタフェースのデフォルトメソッドは計算されません.信じない場合は、試してみてください.複数だとコンパイルエラー(ここではなぜ1つなのかを考える必要がありますが、個人的にはJavaが関数式プログラミングを実現するために「強ねじりの瓜」を行ったのだと思いますが、確かにあまり「甘」ではなく、内部の実現はやはり内部類の論理であるべきか、ここでは推測です)
@FunctionalInterface
public interface LamdaInterface {
    
    public String apply(String name);
    
    //        
    default String addLastName(String name) {
        return apply(name) + "Curry";
    }

}

2.完成には論理を完成する必要があります.空欄を記入するように、すべての内容が完成し、空欄を1つ残して記入します.この空欄は実現する関数論理です.
public class NBAPlayer {
    
    public String firstName;

    //                 。          
    public void printName(LamdaInterface lamdaInterface) {
        System.out.println(lamdaInterface.addLastName(this.firstName));
    }

}
  • Lamda式に従ってコンテンツ
  • を実装する.
        public static void main(String[] args) throws Exception{
            NBAPlayer nbaPlayer = new NBAPlayer();
            nbaPlayer.firstName = "Stephen";
            nbaPlayer.printName(name->name+"·");
        }
    

    完全な手順はこの3つのステップが必要です.ここを見て、友达は私があなたたちをからかっていると思っていますか.この書いたコードも少なくありません.やはり苦痛です.実は実際の開発の過程で、第1歩は私たちが自分でする必要はありません.JDKはjavaにあります.util.functionパッケージには多くのインスタンスがあり、ほとんどの場合をカバーしているので、関数インタフェースを自分で書く必要はありません.ほとんどの場合、2番目のステップも自分でする必要はありません.ほとんどの場合、サードパーティのjarを呼び出すため、この論理はすでに実現されています.1つのチームで基礎プラットフォームの開発者でなければ、このステップの接触も少ないからです.だから私たちにとって実は第三歩を完全にマスターすればOKです.JDKが提供する一般的な関数インタフェースを見てみましょう.
    JDKが提供する関数インタフェース
  • Talk is cheap,show the code.
  • @FunctionalInterface
    public interface Consumer {
        void accept(T var1);
    
        default Consumer andThen(Consumer super T> var1) {
            Objects.requireNonNull(var1);
            return (var2) -> {
                this.accept(var2);
                var1.accept(var2);
            };
        }
    }
    
  • Talk is cheap,show the code.
  • @FunctionalInterface
    public interface Function {
    
        R apply(T t);
    
        default  Function compose(Function super V, ? extends T> before) {
            Objects.requireNonNull(before);
            return (V v) -> apply(before.apply(v));
        }
    
        default  Function andThen(Function super R, ? extends V> after) {
            Objects.requireNonNull(after);
            return (T t) -> after.apply(apply(t));
        }
    
        static  Function identity() {
            return t -> t;
        }
    }
    
  • Talk is cheap,show the code.
  • @FunctionalInterface
    public interface Predicate {
        boolean test(T var1);
    
        default Predicate and(Predicate super T> var1) {
            Objects.requireNonNull(var1);
            return (var2) -> {
                return this.test(var2) && var1.test(var2);
            };
        }
    
        default Predicate negate() {
            return (var1) -> {
                return !this.test(var1);
            };
        }
    
        default Predicate or(Predicate super T> var1) {
            Objects.requireNonNull(var1);
            return (var2) -> {
                return this.test(var2) || var1.test(var2);
            };
        }
    
        static  Predicate isEqual(Object var0) {
            return null == var0 ? Objects::isNull : (var1) -> {
                return var0.equals(var1);
            };
        }
    }
    
  • Talk is cheap,show the code.
  • @FunctionalInterface
    public interface Supplier {
        T get();
    }
    

    上の4種類は私が個人的によく使うと思う4種類で、JDKのソースコードを列挙して、みんなはコードを見て、もし他の形式が必要ならば、先にjavaに行くことを提案します.util.functionバッグを探して、なければ、自分で新築します.第1歩は終わりました.第2部は主に実現の論理で、何も言うことはありません.次に第3歩の書き方を見ます.
    Lamda式の一般的な書き方
    共通コードは、以下で使用します.
    @FunctionalInterface
    interface inter1 {
        String said(String sm);
    }
    
    @FunctionalInterface
    interface inter2{
        Employee getEmployee(String name, String address, int salary, int age);
    }
    
    class Robot{
        
        public String robotGun;
        
        public void attack (inter1 inter1) {
            String attack = inter1.said(robotGun);
            System.out.println(attack);
        }
    }
    
    class Attack{
        public static String attack(String said) {
            return "Attack!!!!!!!" + said;
        }
        
        public  String shot(String said) {
            return "Shot!!!!!!!" + said;
        }
        
        public Employee getEmployee(inter2 inter2,String name, String address, int salary, int age) {
            return inter2.getEmployee(name, address, salary, age);
        }
    }
    
  • パラメータなしで括弧を付けなければならないが、方法体の内容が一言で言えば括弧を付けなくてもよい
  • である.
            Thread thread = new Thread(() -> {System.out.println(1);});
            thread.start();
    

    2.パラメータ、パラメータメソッドヘッダのかっこを省略
            Robot robot = new Robot();
            robot.robotGun = "AWM";
            robot.attack(said ->  said + " attack!");
    

    3.複数のパラメータは、体部が一言以上の場合は括弧を付けなければならない
            List list = Arrays.asList(99,55,66,88);
            Collections.sort(list, (x,y) -> x - y);
            for(Integer num : list) {
                System.out.println(num);
            }
    

    4.静的メソッドの参照
            Attack attack = new Attack();
            robot.attack(Attack::attack);
    

    5.インスタンスオブジェクトの参照方法
            robot.attack(attack::shot);
    

    6.構造方法の参照
            inter2 inter2 = Employee :: new;
            Employee employee = attack.getEmployee(inter2, "xusq", "shanxi", 30000, 18);
            System.out.println(employee.toString());
    

    以上私が列挙したよくあるLamda式の書き方は、よく分からないと思ったら、忘れてしまうでしょう.覚えておくだけで、私たちが伝わるのは関数でokです.静的な方法、メンバーの方法、構造方法はすべて方法で、方法であれば試してみましょう.Lamda式の学習はここまでで、この文章がいくつかのパートナーを助けることができることを望んでいます.真の至善を求め,俊良を尊ぶ.次の号でまた会いましょう.