Java 8関数式プログラミング入門

4051 ワード

最近java 9はすでに発表されていますが.しかし、現在多くの学生はjava 8さえ使っていない.JAva 8は多くの有用な特性を追加し、皆さんのプログラミングに役立ちます.Java 8を使ったことがない学生は、これらの新しい特性を理解する必要があります.
JAva 8には重要な変更があります.関数式プログラミング(Lambda式)が追加されました.従来のJavaの新しい特性に比べて,lambda式は関数式プログラミングに接触していないJavaプログラマーにとってよく理解されていない.だから私はここでわざわざ分かち合って、使ったことのない学生に役に立つことを望んでいます.
なぜlambda式があるのですか?マスターの原話を引用する」未来のプログラミング言語は、単純な宣言言語(以前のJavaなど)や関数プログラミング言語が存在しないで、それぞれの特性を徐々に融合させる.将来、宣言式プログラミング言語は関数プログラミング思想を参考にし、関数プログラミング言語は宣言式プログラミング特性を融合させる...これはほとんど必然的な傾向である」と述べた.
Lambda式とは
  • 関数をパラメータとしてjavaメソッドに渡す.
  • 従来のjavaメソッドでは、次のような値または参照を渡すことしかできませんでした.
    test.hello("hello world");//        

    lambda式では
    Thread thread = new Thread(() -> System.out.println("hello world"));
    thread.start();

    新Thread()パラメータは、「hello world」を印刷する動作を伝達する.
  • lambda式は、特別なオブジェクトタイプの関数インタフェースFunctionalInterfaceのクラスに依存する必要があります.たとえば、上記のnew Thread()メソッドは、Java 8ではRunnableインタフェースが関数インタフェースであるRunnable口実をパラメータとして受信します.
  • は、値ではなく動作を伝達する.
  • は抽象階層を向上させ、APIの再利用性がより良い.

  • 最初の例
    //1.          (            )
    @FunctionalInterface
    interface Interface1 {
        void test();
    }
    
    //2.       ,   Interface1    
    public void testMethod(Interface1 interface1){
        interface1.test();
    }
    
    //3.          :   ,         Interface1,         
    public static void main(String[] args){
        Test test = new Test();
        test.testMethod(() -> System.out.println("hello world"));
    }

    mainメソッドではtest.testMethod()メソッドを呼び出すと、「hello world」という動作が渡されます.これが最も基本的なlambda式の例です.
    Lambda式の基本構造:
    (argument)->例えば(arg 1,arg 2...)->{}(type 1 arg 1,type 2 arg 2...)->{body}例説明:(int a,int b)->return a+b}()->System.out.println("Hello world");(String s)->System.out.println(s);}()->Hello world()->return「Hello world」;}1.1つのlambda式には0つ以上のパラメータがあり得る2.パラメータのタイプは明確に宣言してもよいし、コンテキストに基づいて推定してもよい.(int a)と(a)3.すべてのパラメータをカッコに含める必要があります.パラメータの前にカンマで区切る4.カッコはパラメータセットが空であることを表します.例えば()->「Hello world」5.パラメータが1つしかない場合、タイプは導出可能であり、()は省略可能である.a->{body}6.lambda式のボディには、ゼロまたは複数の文を含めることができます.7.lambda式のボディに1つの文しかない場合、{}は省略できます.8.lambda式のボディに1つ以上の文が含まれている場合、式は{}に含める必要があります.匿名関数の戻りタイプは、コードブロックの戻りタイプと一致します.
    関数インタフェースfuncationalInterface:
    1.1つのインタフェースには、関数インタフェースと呼ばれる抽象的な方法が1つしかありません.2,あるインタフェースでfunctionalInterfaceを宣言すると、コンパイラは関数式インタフェースの定義に従ってインタフェースを要求し、定義を満たさないとエラー3を報告し、あるインタフェースに抽象的な方法が1つしかないが、functionalinterface注釈を宣言していない場合、コンパイラは依然としてそのインタフェースを関数式インタフェース4と見なしている.インタフェースの1つの方法がjava.lang.Objectを上書きする方法である場合、この方法は関数式の方法の個数内に計画されない.5、関数式インタフェースはLambda式、方法参照、コンストラクタ参照によって実現することができる.6、java 8では、インタフェースは実在するdefault方法を含むことができることに注意する.リストインタフェースにはこのようなdefault方法がある.
    default void replaceAll(UnaryOperator operator) {
        Objects.requireNonNull(operator);
        final ListIterator li = this.listIterator();
        while (li.hasNext()) {
            li.set(operator.apply(li.next()));
        }
    }

    Lambda式の最も基本的な入門は終わりました.後で詳しく紹介します.