Java 8の新特性のlambada(動力ノードJava学院整理)

3449 ワード

関数インターフェース
関数式インターフェース(functional interfaceも機能インターフェースといいますが、実は同じものです。)簡単に言えば,関数式インターフェースは一つの方法だけを含むインターフェースである。たとえばJava標準ライブラリのjava.lang.Runnableとjava.util.compratorは典型的な関数式インターフェースです。java 8は@Funtional Interfaceを注釈として提供していますが、この注釈は必須ではありません。インターフェースが関数式インターフェースの標準(つまり、一つの方法のインターフェースのみを含む)に符合する限り、仮想機会は自動的に判断しますが、インターフェース上で注釈@Funtional Interfaceを使って、チームの他の人が誤ってインターフェースに新しい方法を追加しないように声明したほうがいいです。Javaのlamdaは単独では出現できません。関数式のインターフェースを必要としています。lamda表現の方法体は実は関数インターフェースの実現です。以下に文法会について説明します。
ランバー文法
三つの部分を含む
1. 括弧内のコンマで区切られた形式のパラメータは、関数式インターフェース内のメソッドのパラメータです。
2. 矢印記号:->
3. 方法体は、表現とコードブロック、メソッドの関数式インターフェース内の方法の実装であっても良いです。コードブロックであれば、必ず{}で包んでください。そして、リターン値が必要ですが、例外があります。関数式インターフェース内の方法の戻り値がvoidであれば、{}は必要ありません。
全体的にこのように見えます。

(parameters) -> expression    (parameters) -> { statements; }
完全な例を見て、分かりやすいです。

/**
 *   lambda   
 *
 */
public class TestLambda {
  public static void runThreadUseLambda() {
    //Runnable       ,          ,  void run  ;
    //  lambda         ,     return,          
    new Thread(() ->System.out.println("lambda     ")).start(); 
  }
  public static void runThreadUseInnerClass() {
    //         ,            
    new Thread(new Runnable() {
      @Override
      public void run() {
        System.out.println("        ");
      }
    }).start();
  }
  public static void main(String[] args) {
    TestLambda.runThreadUseLambda();
    TestLambda.runThreadUseInnerClass();
  }
}
ラダ式を使って設計したコードはより簡潔で、しかも読むことができます。
メソッド参照
実際には、lamda表現の簡略化された書き方です。引用された方法は、実際にはlamband表現の方法体で実現されています。文法も簡単です。左は容器です。中間は「:」で、右は対応する方法名です。以下の通りです

ObjectReference::methodName
一般的な方法の参照書式は
1. 静的な方法なら、Class Name:methodNameです。Objectのように:equals
2. 例の方法なら、Instance:methodNameです。Object obj=new Object();obj::equals;
3. 構造関数はClass Name:newです。
もう一つの完全な例を見てください。分かりやすいです。

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
 *
 */
public class TestMethodReference {
  public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setLayout(new FlowLayout());
    frame.setVisible(true);
 
    JButton button1 = new JButton("  !");
    JButton button2 = new JButton("   !");
 
    frame.getContentPane().add(button1);
    frame.getContentPane().add(button2);
    //  addActionListener      ActionListener,        
    //  lambda     
    button1.addActionListener(e -> { System.out.println("   Lambda    "); });
    //        
    button2.addActionListener(TestMethodReference::doSomething);
  }
  /**
   *         ActionListener     
   * @param e 
   */
  public static void doSomething(ActionEvent e) {
 
    System.out.println("           ");
  }
}
doSomething方法はlamda表現の実現であり、このような利点は、lamban daの方法が長いと感じたら、コードの読み取り可能性に影響を与え、方法引用は解決方法であると考えられています。
締め括りをつける
以上はlamda表現の文法の全部です。皆さんはlamda表現に対して一定の理解があると思いますが、コードが簡潔になっているだけで、このメリットは多くの観衆を感動させることができません。java 8も期待されません。実はjava 8がlamband表現を導入するのは、データのマルチスレッドやマルチコア処理を簡単にすることができるからです。より速い集合処理速度を提供します。