ホームページ  >  記事  >  Java  >  Java8 ナニーレベルのラムダ式ソースコード分析

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

WBOY
WBOY転載
2023-04-14 23:04:031102ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。