JAva 8,Lambda式および関数式インタフェースの使用

2903 ワード

前言:最近技術の博文を見て、if..elseが多すぎる情況について、以前の解決策は一般的に策略のモードを使うので、しかしこの博文は新しい構想をあげて、Java 8 Lambdaの表現式を利用してMapと関数式のインタフェースをプラスして優美な解決の構想を実現します.では、問題が来ました.Lambda式とは何ですか.関数インタフェースとは?
一、Lambda式とは何ですか.
まずいくつかの例を見てみましょう.
// 1.      ,     5  
() -> 5  
  
// 2.       (    ),   2     
x -> 2 * x  
  
// 3.   2   (  ),          
(x, y) -> x – y  
  
// 4.   2 int   ,        
(int x, int y) -> x + y  
  
// 5.      string   ,       ,      (       void)  
(String s) -> System.out.print(s)

 式を->、->左、->右の3つの部分に分けることができます.->左がメソッドが受け入れるパラメータであり,->右がメソッドの具体的な実装であることは容易に分かる.x->2*xで  例として、この方法を以前の書き方で表すと、
private X method(X x){
    return 2*x
}

以上の例では、Lambda式の次の重要な特性を見ることができます.
  • オプションタイプ宣言:パラメータタイプを宣言する必要はありません.コンパイラはパラメータ値を統一的に識別できます.
  • オプションのパラメータカッコ:1つのパラメータはカッコを定義する必要はありませんが、複数のパラメータはカッコを定義する必要があります.
  • オプションのかっこ:マスターに文が含まれている場合は、カッコを使用する必要はありません.
  • オプションの戻りキー:マスターが式の戻り値が1つしかない場合、コンパイラは自動的に値を返し、カッコは明示的な式が数値を返すことを指定する必要があります.

  • はい、Lambda式は見ますが、具体的にはどうやって使いますか?
    答えはjavaが私たちに多くの基礎関数式インタフェースを提供していることです.例えば、次の例です.
        public static void main(String[] args) {
            IntBinaryOperator intBinaryOperator = (x,y) -> x - y;
            System.out.println(intBinaryOperator.applyAsInt(2, 1));  // 1
    
            Function function = (x) -> String.format("hello %s !", x);
            System.out.println(function.apply("world"));  // hello world!
        }

    Lambda式で構成された関数は関数式インタフェースを返し,Lambda式で構成された関数はこのインタフェースの実現である.次の関数インタフェースの内容を確認できます.
    @FunctionalInterface
    public interface IntBinaryOperator {
    
        /**
         * Applies this operator to the given operands.
         *
         * @param left the first operand
         * @param right the second operand
         * @return the operator result
         */
        int applyAsInt(int left, int right);
    }

    二、関数式インタフェースとは何ですか.
    1.関数式インタフェースと呼ばれる抽象的なメソッドのみを含むインタフェース.2.Lambda式でインタフェースのオブジェクトを作成できます.(Lambda式が検出された例外を放出する場合、この例外はターゲットインタフェースの抽象メソッドで宣言する必要があります).3、任意の関数インタフェースで@FunctionalInterface注釈を使用できます.これにより、関数インタフェースであるかどうかを確認できます.javadocには、このインタフェースが関数インタフェースであることを示す宣言が含まれます.4、java.util.functionパッケージの下でjava 8を定義した豊富な関数式インタフェース
    したがって、関数インタフェースをカスタマイズするには、 @FunctionalInterface注釈は、関数式インタフェースの仕様を満たすだけでよく、インタフェースでも抽象クラスでもよい.
    @FunctionalInterface
    public interface MyFunctionalInterface {
    
        String method(String str);
    
        public static void main(String[] args) {
            MyFunctionalInterface function = (x) -> String.format("hello %s !", x);
            System.out.println(function.method("world"));  // hello world!
        }
    }

    参考文献:
    Java 8の新しい機能の関数インタフェース-https://blog.csdn.net/qinchao_mei/article/details/97649152
    Java 8 Lambdaエクスプレッション|菜鳥チュートリアル-https://www.runoob.com/java/java8-lambda-expressions.html