ホームページ Java &#&チュートリアル ラムダ式の簡単な分析、Java 8 の新機能

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

Jan 23, 2017 pm 03:33 PM

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaリモートデバッグでは、リモートサーバーで一定の値を正しく取得するにはどうすればよいですか? Javaリモートデバッグでは、リモートサーバーで一定の値を正しく取得するにはどうすればよいですか? Apr 19, 2025 pm 01:54 PM

Javaリモートデバッグでの絶え間ない買収に関する質問と回答は、Javaをリモートデバッグに使用する際に、困難な現象に遭遇する可能性があります。それ...

バックエンド開発を学習するときにJavaプロジェクト管理ツールを選択する方法は? バックエンド開発を学習するときにJavaプロジェクト管理ツールを選択する方法は? Apr 19, 2025 pm 02:15 PM

初心者向けのJavaプロジェクト管理ツールを選択することと混同します。バックエンド開発を学び始めたばかりの人にとっては、適切なプロジェクト管理ツールを選択することが重要です...

TomcatがSpring-Webモジュールをロードすると、SPIメカニズムはJavaクラスローダーの可視性の原理を本当に破壊しますか? TomcatがSpring-Webモジュールをロードすると、SPIメカニズムはJavaクラスローダーの可視性の原理を本当に破壊しますか? Apr 19, 2025 pm 02:18 PM

TomcatがSpring-WEBモジュールをロードするときのSPIメカニズムのクラス負荷挙動の分析。 Tomcatは、Spring-WebモジュールをロードするときにSpring-Webが提供するServleを発見して使用するために使用されます...

WebSocketサーバーが401を返した後、ブラウザが応答しない理由は何ですか?それを解決する方法は? WebSocketサーバーが401を返した後、ブラウザが応答しない理由は何ですか?それを解決する方法は? Apr 19, 2025 pm 02:21 PM

Websocketサーバーが401を返した後、ブラウザの反応しないメソッド。Nettyを使用してWebsocketサーバーを開発すると、トークンを確認する必要があることがよくあります。 �...

糸でpyflinkジョブを送信するときにエラーを報告するのはなぜですか? 糸でpyflinkジョブを送信するときにエラーを報告するのはなぜですか? Apr 19, 2025 pm 02:06 PM

PyflinkのジョブをYARNに送信するときにPythonスクリプトが見つからない理由の分析Yarnを介してPyflinkジョブを提出しようとすると、遭遇する可能性があります...

ProjectがJavaで開始されたときにEasypoiでの@excel AnnotationのSavePathパラメーターを動的に変更する方法は? ProjectがJavaで開始されたときにEasypoiでの@excel AnnotationのSavePathパラメーターを動的に変更する方法は? Apr 19, 2025 pm 02:09 PM

開発プロセス中にJavaでエンティティクラスのアノテーションのパラメーターを動的に構成する方法は、さまざまな環境に応じて注釈パラメーターを動的に構成する必要性に遭遇することがよくあります...

分散システムの最終的な一貫性:適用する方法とデータの矛盾を補う方法は? 分散システムの最終的な一貫性:適用する方法とデータの矛盾を補う方法は? Apr 19, 2025 pm 02:24 PM

分散システム分散トランザクション処理における最終的な一貫性の適用を調査することは、分散システムアーキテクチャにおいて常に問題となっています。問題を解決するために...

OAUTH2.0のスコープメカニズムを介して、ネストされたH5ページの特定のインターフェイスへのアクセスを制限する方法は? OAUTH2.0のスコープメカニズムを介して、ネストされたH5ページの特定のインターフェイスへのアクセスを制限する方法は? Apr 19, 2025 pm 02:30 PM

OAUTH2.0のAccess_Tokenを使用して、インターフェイスアクセス許可を制御する方法は? OAuth2.0の適用では、...

See all articles