ホームページ >Java >&#&チュートリアル >Java8 ナニーレベルのラムダ式ソースコード分析
ラムダ式で最も一般的に使用される機会は匿名内部クラスの置換であることは間違いなく、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(); }
最終出力:
古い実行可能ファイルは現在使用しています!
これはラムダ関数です!
これは恐ろしいほど強力ではないでしょうか?恐ろしく単純なのでしょうか?恐ろしいほど明瞭で集中力があるでしょうか?これがラムダ式の恐ろしい点で、前のクラスが実行したことを実行するために非常に少ないコードしか使用しません。
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 でスコープ解決を記述する方法に少し似ており、ここでも可能です。
関数型プログラミングとラムダ式に関して言えば、マップについて触れないわけにはいきません。 。 。はい、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 倍にして出力します。
マップについて言及されているので、リデュースについて言及しないわけにはいきません。 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.0for ループを使用してこれを行う場合:
@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)); }最終結果:
は実行されますPython や Scala が Java で書かれているような気がしますか?彼はとてもハンサムではありませんか? 6. 関数型インターフェイス Predicate との連携言語レベルで関数型プログラミング スタイルをサポートすることに加えて、Java 8 では java.util.function と呼ばれるパッケージも追加されています。 Java での関数型プログラミングをサポートする多くのクラスが含まれています。 java.util.function.Predicate 関数インターフェイスとラムダ式を使用すると、API メソッドにロジックを追加し、より少ないコードでより動的な動作をサポートできます。 Predicate インターフェイスはフィルタリングに非常に適しています。30.0
40.0
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 で始まります:ご覧のとおり、Stream API の filter メソッドは述語も受け入れます。つまり、カスタマイズした filter() メソッドを述語に置き換えることができます。インラインコードに書かれています。これもラムダ式の魔法です。Java
言語は次で終わります:Java
すべての言語:
scalaJava
言語なし: 言語の長さの大きい 3:
Python
scala
Shell
RPython
scala
Shell
以上がJava8 ナニーレベルのラムダ式ソースコード分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。