Java 8:匿名内部クラスからLambda式へ&メソッドリファレンス


匿名内部クラス、lambda、メソッドリファレンスは実は共通しており、匿名内部クラスからlambdaからメソッドリファレンスまでは進化の過程であり、簡略化された過程であり、抽象的な過程である.
役割はすべてインタフェースを実現する方法であり、言い換えればインタフェースを実現することである.ただこのインタフェースには抽象的な方法しかありません.
匿名の内部クラス
実装クラスを省き,直接newインタフェース名(){...}実装クラス名はありません.実際には、インタフェースオブジェクトが実装され、作成されます.
  • 匿名内部クラスすなわち名前のない内部クラス
  • 名前がないため、匿名の内部クラスは1回しか使用できません.通常、コード作成を簡略化するために使用されます.
  • 匿名の内部クラスを使用するには、親クラスを継承するか、インタフェース
  • を実装する必要があるという前提条件があります.
    匿名の内部クラスは名前がないので、作成方法がおかしいです.作成形式は次のとおりです.
    new      (    )|    ()  
        {  
         //            
        }
  • ここでは、匿名の内部クラスを使用するには、親クラスを継承するか、インタフェースを実装する必要があります.もちろん、親クラスを1つだけ継承するか、インタフェースを実装することもできます.匿名の内部クラスがnewを直接使用してオブジェクトの参照を生成するため、classキーワードもありません.もちろんこの引用は暗黙的です.

  • Lambda式
    newインタフェース名を省略しました.に簡略化実際には、インタフェースオブジェクトも実装され、作成されます.
    このメソッドのパラメータタイプに応じて、Lambda式をカッコで使用できるかどうかのメソッドのパラメータです.
    ----1つの関数式インタフェースであるかどうか(1つの抽象的なメソッドで複数のdefaultメソッドを持つインタフェースしかない)、構築方法も同様である.
    Lambda式を簡潔で伝達可能な匿名関数として定義することができます.
    まず、lambda式は本質的に特定のクラスに属していないが、パラメータリスト、関数本体、戻りタイプ、異常を投げ出すことができる関数であることを明確にする必要があります.
    次に匿名で、lambda式には具体的な関数名がありません.Lambda式はパラメータのように伝達することができ,コードの記述を極めて簡略化することができる.フォーマットは次のように定義されます.
       :      ->    
       :      -> {     }

    次の点に注意してください.
  • lambda式にはreturnキーワードが隠されているため、単一の式ではreturnキーワードを明示的に書く必要はありません.
  • ただし、式が文の集合である場合、returnを明示的に追加し、カッコ{ }で複数の式を囲む必要があります.次に、いくつかの例を示します.
  • //          ,  return  
    (String s) -> s.length() 
    
    //     42     
    () -> 42 
    
    //        ,        
    (int x, int y) -> {
        int z = x * y;
        return x + z;
    }

     
    メソッド参照
    Lambdaを省き,インタフェースメソッド実装の内容を特定のメソッドにカプセル化し,メソッドをインタフェース実装とし,実際にはインタフェースオブジェクトを作成する.
    より抽象的であるだけで,インタフェースメソッドの内部実装しか見られない(呼び出されたこのメソッドは具体的な実装である).
    メソッドは、より近い簡略化コードを参照します.この簡略化により、コードがより直感的に見える場合があります.まず、例を見てみましょう.
    /* ...   apples       */
    
    //   lambda   
    apples.sort((Apple a, Apple b) -> Float.compare(a.getWeight(), b.getWeight()));
    
    //       
    apples.sort(Comparator.comparing(Apple::getWeight));

    メソッドリファレンスは、::によってメソッドの隷属とメソッド自体を接続し、主に3つのクラスに分けられます.
    スタティツクメソッド
    (args) -> ClassName.staticMethod(args)
       
    ClassName::staticMethod

    パラメータのインスタンスメソッド
    (args) -> args.instanceMethod()
       
    ClassName::instanceMethod  // ClassName args   

    外部のインスタンスメソッド
    (args) -> ext.instanceMethod(args)
       
    ext::instanceMethod(args)