ホームページ  >  記事  >  Java  >  ラムダ式の簡単な分析、Java 8 の新機能

ラムダ式の簡単な分析、Java 8 の新機能

高洛峰
高洛峰オリジナル
2017-01-23 15:33:371626ブラウズ

Java 8 と言えば、最初に思い浮かぶのはラムダ (クロージャ) と仮想拡張メソッド (デフォルト メソッド) です。この機能は、主要なテクノロジー Web サイトで長い間宣伝されてきました。また、この機能は、次の記事で説明する最初の機能でもあります。 Java 8 シリーズ (JEP126 http://openjdk.java.net/jeps/126) の始まりとして、jdk8 の一部のライブラリはラムダ式を使用して再設計されています。これを理解することは、Java 8 の新機能を学ぶ上で非常に重要です。

1. 関数型インターフェース

関数型インターフェース(関数型インターフェースは関数型インターフェースとも呼ばれますが、実際には同じものです)。簡単に言えば、関数型インターフェイスはメソッドを 1 つだけ含むインターフェイスです。たとえば、Java 標準ライブラリの java.lang.Runnable や java.util.Comparator は、代表的な関数インターフェイスです。 Java 8 では、アノテーションとして @FunctionalInterface が提供されていますが、このアノテーションは、関数インターフェースの標準を満たしている限り、仮想マシンが自動的に決定します。インターフェイスで @FunctionalInterface アノテーションを使用して宣言するのが最善です。これにより、チームの他のメンバーが誤ってインターフェイスに新しいメソッドを追加するのを防ぐことができます。
Java の Lambda は単独で使用することはできません。ラムダ式メソッド本体は実際には関数インターフェースの実装です

2. Lambda 構文

3 つの部分が含まれています。 1. 括弧内のカンマで区切られた仮パラメータ。パラメータは関数インターフェイス内のメソッドのパラメータです: ->

3. メソッド本体。メソッド 関数型インターフェイスのメソッドの実装は、コード ブロックの場合は {} で囲む必要があり、戻り値が必要ですが、関数型インターフェイスのメソッドの戻り値が次の場合には例外が発生します。 void、{} は必要ありません。

全体的な外観は次のようになります:

(parameters) -> expression 或者 (parameters) -> { statements; }

理解しやすいように完全な例を見てください

/**
 * 测试lambda表达式
 *
 * @author benhail
 */
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();
    }
}

ラムダ式を使用して設計されたコードがより簡潔で読みやすいことがわかります。

3. メソッド参照

は、実際にはラムダ式のメソッド本体の実装です。構文も非常に単純です。クラス名、インスタンス名)、真ん中が「::」、右側が対応するメソッド名です。以下に示すように:

ObjectReference::methodName

一般的なメソッドの参照形式は

静的メソッドの場合は ClassName::methodName です。例えば、Object::equals

インスタンスメソッドの場合は、Instance::methodNameとなります。たとえば、Object obj=new Object();obj::equals;

constructor です。これは ClassName::new

理解しやすいように完全な例を見てみましょう:

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
 *
 * @author benhail
 */
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 メソッドが次のとおりであることがわかります。ラムダ式の利点は、ラムダ メソッドが非常に長く、コードの可読性に影響を与えると感じた場合、メソッド参照が解決策になることです

4. まとめ

上記はラムダ式の構文の全内容です。私たちは皆、ラムダ式についてある程度の理解を持っていると信じていますが、簡潔なコードの利点だけでは多くの視聴者に感動を与えることはなく、Java 8 ではラムダ式の導入が緊急に必要とされているわけではありません。ラムダ式を簡略化できるため、コレクション上のデータをマルチスレッドまたはマルチコアで処理することで、コレクションの処理速度が向上します。これについては、後で 3 つの部分に分けて説明します。この機能は多すぎます。この部分では、読者がラムダ式とメソッド参照の構文と概念について説明します。最後の部分は、仮想拡張メソッド (デフォルト メソッド) について説明します。大量のデータ収集の処理とラムダ式の解明 ミステリーの最も強力な役割。

ラムダ式の分析、Java 8 の新機能に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。