Javaの匿名クラスとLambda式

2590 ワード

匿名クラス
匿名クラスは名前のない内部クラスであり、オブジェクトインスタンスは1つしか作成できません.クラスやインタフェースのリロード方法など、いくつかの「追加」機能を実装してオブジェクトのインスタンスを作成する場合は、実際にサブクラス化する必要がない場合に便利です.
匿名クラスは主に2つの方法で作成されます.
  • 継承クラス(抽象的または具体的であってもよい)
  • 実装インタフェース
  • Javaは匿名クラスの作成を導入し,コードの複雑さを低減した.インタフェースを実装し、そのインスタンスを使用してメソッドを呼び出すために別のクラスを作成すると、オーバーヘッドが発生します.他の場所でこのクラスを使用しないと、このコストは少し浪費されます.この場合、メソッドボディ内で作成したり、メソッドパラメータとして作成したりする匿名クラスを使用できます.
    Lambda式
    Lambda式はJava 8に導入された新しい機能である.Lambda式は匿名関数です.名前がなく、クラスに属していない関数.
    Lambda式は、機能インタフェースを表すインスタンス(単一の抽象的なメソッドを持つインタフェースを機能インタフェースと呼びます.java.lang.Runnableなど).Lambda式は、関数インタフェースと呼ばれる唯一の抽象関数を実現する.
    Lambda式を作成するには、lambda演算子->の左側に入力パラメータ(ある場合)を指定し、式または文ブロックをlambda演算子の右側に配置します.たとえば、lambda式:(x,y)->x+y lambda式に2つのパラメータxとyがあり、それらの和を返すことを指定します.
    // lambda      
    (parameter_list )-> { function_body }
    

    Lambda式は、次の機能を提供します.
  • は、機能をメソッドパラメータと見なすか、コードをデータと見なすかを有効にします.
  • は、クラスに属さない関数を作成できます.
  • は、lambda式をオブジェクトとして渡し、必要に応じて実行することができる.

  • プログラムの例
    インタフェース
    public interface Animal {
    	public void eat();
    }
    

    一般的なインタフェース実装
    public class SeaAnimal implements Animal{
    
    	@Override
    	public void eat() {
    		System.out.println("SeaAnimal class implementing eat()");
    	}
    
    }
    
    public class Test {
    	public static void main(String[] args) {
    		Animal animal = new SeaAnimal();
    		animal.eat();
    	}
    }
    

    匿名クラス
    public class Test1 {
    	public static void main(String[] args) {
    		Animal animal = new Animal() {
    
    			@Override
    			public void eat() {
    				System.out.println("Anonymous class implementing eat()");
    			}
    
    		};
    
    		animal.eat();
    	}
    }
    
    

    Lambda式
    public class Test2 {
    	public static void main(String[] args) {
    		Animal animal = ()->System.out.println("Lambda Expression implementing eat()");	
    		animal.eat();
    	}
    }
    

    Lambda式を使用してコードをより簡単にする方法を見ることができます.ただし、すべての匿名クラスがLambda式で代用できるわけではありません.
    それらの違い
    匿名クラス
    Lambda式
    名前のないクラス
    名前のないメソッド(匿名関数)
    抽象的または特定のクラスを拡張できます
    抽象的または特定のクラスを拡張することはできません
    任意の抽象的なメソッドを含むインタフェースを実現できます
    単一の抽象メソッドを含むインタフェースを実現できます
    匿名クラスには、インスタンス変数とメソッドローカル変数があります.
    Lambda式はローカル変数のみ
    匿名の内部クラスをインスタンス化できます
    Lambda式はインスタンス化できません
    匿名内部クラス内では、「this」は常に外部オブジェクトではなく現在の匿名内部クラスオブジェクトを指します.
    Lambda式の内部では、「this」は常に現在の外部クラスオブジェクト、すなわちクラスオブジェクトを囲むオブジェクトを参照します.
    多くの方法を処理するには最適です
    インタフェースを処理するには、これが最適です.
    コンパイル時には、個別のものが生成する.classファイル
    コンパイル時には、個別のものは生成する.classファイル.外部クラスに変換するプライベートメソッドのみ
    オブジェクトを作成するたびに、メモリ割り当てはオンデマンドです.
    JVMの永続メモリに存在します