目次
1. 匿名内部クラスの置換
2. ラムダ式を使用してコレクションを反復処理する
3. ラムダ式を使用してマップを実装する
4. ラムダ式を使用してマップとリデュースを実装します。
ホームページ Java &#&チュートリアル Java8 ナニーレベルのラムダ式ソースコード分析

Java8 ナニーレベルのラムダ式ソースコード分析

Apr 14, 2023 pm 11:04 PM
java lambda

1. 匿名内部クラスの置換

ラムダ式で最も一般的に使用される機会は匿名内部クラスの置換であることは間違いなく、Runnable インターフェイスの実装は匿名内部クラスの典型的な例です。ラムダ式は非常に強力なので、()-> を使用して匿名内部クラス全体を置き換えることができます。コードを見てください:

匿名内部クラスを使用する場合:

    @Test
    public void oldRunable() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("The old runable now is using!");
            }
        }).start();
    }
ログイン後にコピー

ラムダ式を使用する場合:

    @Test
    public void runable() {
        new Thread(() -> System.out.println("It's a lambda function!")).start();
    }
ログイン後にコピー

最終出力:

古い実行可能ファイルは現在使用しています!

これはラムダ関数です!

これは恐ろしいほど強力ではないでしょうか?恐ろしく単純なのでしょうか?恐ろしいほど明瞭で集中力があるでしょうか?これがラムダ式の恐ろしい点で、前のクラスが実行したことを実行するために非常に少ないコードしか使用しません。

2. ラムダ式を使用してコレクションを反復処理する

Java のコレクション クラスは日常の開発で頻繁に使用され、コレクション クラスを使用しない Java コードは存在しないとも言われています。 。 。コレクション クラスに対する最も一般的な操作は、反復トラバーサルです。比較を参照してください:

    @Test
    public void iterTest() {
        List<String> languages = Arrays.asList("java","scala","python");
        //before java8
        for(String each:languages) {
            System.out.println(each);
        }
        //after java8
        languages.forEach(x -> System.out.println(x));
        languages.forEach(System.out::println);
    }
ログイン後にコピー

scala に精通している場合は、forEach にも精通しているはずです。コレクション内のすべてのオブジェクトを反復処理し、ラムダ式をオブジェクトに組み込みます。

languages.forEach(System.out::println);
ログイン後にコピー

この行は、C でスコープ解決を記述する方法に少し似ており、ここでも可能です。

3. ラムダ式を使用してマップを実装する

関数型プログラミングとラムダ式に関して言えば、マップについて触れないわけにはいきません。 。 。はい、Java8 は確実にサポートされています。サンプルコードを参照してください:

    @Test
    public void mapTest() {
        List<Double> cost = Arrays.asList(10.0, 20.0,30.0);
        cost.stream().map(x -> x + x*0.05).forEach(x -> System.out.println(x));
    }
ログイン後にコピー

最終出力結果:

10.5

21.0

31.5

関数型プログラミングにおいてマップ関数は最も重要な手法と言えます。マップの機能は、あるオブジェクトを別のオブジェクトに変換することです。この例では、map メソッドによってコストをサイズの 0.05 倍にして出力します。

4. ラムダ式を使用してマップとリデュースを実装します。

マップについて言及されているので、リデュースについて言及しないわけにはいきません。 map と同様、reduce も関数型プログラミングで最も重要なメソッドの 1 つです。 。 。 map の機能は 1 つのオブジェクトを別のオブジェクトに変更することですが、reduce の機能はすべての値を 1 つにマージすることです。参照してください:

    @Test
    public void mapReduceTest() {
        List<Double> cost = Arrays.asList(10.0, 20.0,30.0);
        double allCost = cost.stream().map(x -> x+x*0.05).reduce((sum,x) -> sum + x).get();
        System.out.println(allCost);
    }
ログイン後にコピー

最終結果は:

# 63.0

for ループを使用してこれを行う場合:

    @Test
    public void sumTest() {
        List<Double> cost = Arrays.asList(10.0, 20.0,30.0);
        double sum = 0;
        for(double each:cost) {
            each += each * 0.05;
            sum += each;
        }
        System.out.println(sum);
    }
ログイン後にコピー

map Reduce ラムダ式の使用は 1 レベル以上高いと思います。

5.filter 操作

Filter もよく使用する操作です。コレクションを操作する場合、多くの場合、元のコレクションから一部の要素をフィルターで除外する必要があります。

    @Test
    public void filterTest() {
        List<Double> cost = Arrays.asList(10.0, 20.0,30.0,40.0);
        List<Double> filteredCost = cost.stream().filter(x -> x > 25.0).collect(Collectors.toList());
        filteredCost.forEach(x -> System.out.println(x));

    }
ログイン後にコピー

最終結果:

30.0

40.0

は実行されますPython や Scala が Java で書かれているような気がしますか?彼はとてもハンサムではありませんか?

6. 関数型インターフェイス Predicate との連携

言語レベルで関数型プログラミング スタイルをサポートすることに加えて、Java 8 では java.util.function と呼ばれるパッケージも追加されています。 Java での関数型プログラミングをサポートする多くのクラスが含まれています。 java.util.function.Predicate 関数インターフェイスとラムダ式を使用すると、API メソッドにロジックを追加し、より少ないコードでより動的な動作をサポートできます。 Predicate インターフェイスはフィルタリングに非常に適しています。

    public static void filterTest(List<String> languages, Predicate<String> condition) {
        languages.stream().filter(x -> condition.test(x)).forEach(x -> System.out.println(x + " "));
    }

    public static void main(String[] args) {
        List<String> languages = Arrays.asList("Java","Python","scala","Shell","R");
        System.out.println("Language starts with J: ");
        filterTest(languages,x -> x.startsWith("J"));
        System.out.println("\nLanguage ends with a: ");
        filterTest(languages,x -> x.endsWith("a"));
        System.out.println("\nAll languages: ");
        filterTest(languages,x -> true);
        System.out.println("\nNo languages: ");
        filterTest(languages,x -> false);
        System.out.println("\nLanguage length bigger three: ");
        filterTest(languages,x -> x.length() > 4);
    }
ログイン後にコピー
最終出力結果:

言語は J で始まります:

Java

言語は次で終わります:

Java
scala

すべての言語:

Java
Python
scala
Shell
R

言語なし:

言語の長さの大きい 3:

Python
scala
Shell

ご覧のとおり、Stream API の filter メソッドは述語も受け入れます。つまり、カスタマイズした filter() メソッドを述語に置き換えることができます。インラインコードに書かれています。これもラムダ式の魔法です。

以上がJava8 ナニーレベルのラムダ式ソースコード分析の詳細内容です。詳細については、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の完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

See all articles