ホームページ  >  記事  >  Java  >  Java のストリームとラムダ: 例を含む関数型プログラミングのガイド

Java のストリームとラムダ: 例を含む関数型プログラミングのガイド

王林
王林オリジナル
2024-08-16 10:31:35470ブラウズ

Streams and Lambdas in Java: A Guide to Functional Programming with Examples

関数型プログラミングは、現代のソフトウェア開発で広く使用されているアプローチです。 Java はオブジェクト指向プログラミングと関数型プログラミングの両方をサポートする言語であり、その第 8 バージョンでストリームとラムダが導入されました。これらの機能により、開発者は関数型スタイルをコレクションに適用して、コレクションに対する操作をより効率的かつクリーンにすることができます。

Java のストリーム
Java のストリームは、コレクションを要素のフローに変換します。これらにより、開発者はマッピング、フィルタリング、削減などの機能的な操作をコレクションに対して実行できます。ストリームは、データの変換、集約、またはフィルタリングを伴う操作に最適に使用されます。

ストリームの使用例は、名前のリストをアルファベット順に並べ替えることです。以下に示すように、名前のリストを作成し、ストリームを使用してそれらを並べ替えることができます。

リスト names = Arrays.asList("ジョン", "メアリー", "デビッド", "エミリー", "トム");
names.stream().sorted().forEach(System.out::println); //出力: デビッド、エミリー、ジョン、メアリー、トム

ここでは、リスト上の stream() メソッドを使用してストリームを作成しました。次に、sorted() メソッドを適用して、ストリーム内の要素を自然な順序で並べ替えました。最後に、forEach() メソッドを使用して、ストリーム内の各要素を出力します。

Java のラムダ
ラムダは、Java でファーストクラス関数を定義するために使用されます。これらの関数は、ストリームから要素を消費し、それらに対して操作を実行できます。ラムダはクラスの外部で定義され、関数に引数として渡すことができます。

ストリームでラムダを使用するには、関数型インターフェイスの概念を理解する必要があります。これらは、抽象メソッドを 1 つだけ持つインターフェイスです。ラムダ式を使用すると、関数インターフェイスの抽象メソッドの具体的な実装を提供できます。

ラムダを使用して名前のリストを並べ替えます
上記の例を基にして、ラムダを使用して名前を降順に並べ替えてみましょう。

リスト names = Arrays.asList("ジョン", "メアリー", "デビッド", "エミリー", "トム");
names.stream().sorted((a, b) -> b.compareTo(a)).forEach(System.out::println)); //出力: トム、メアリー、ジョン、エミリー、デビッド

ここでは、sorted() メソッドの引数としてラムダ式を使用しました。このラムダ関数は 2 つの引数 (a と b) を受け入れ、それらを比較し、比較に基づいて正、負、またはゼロの値を返します。これにより、要素に対して CompareTo() メソッドを使用して要素を降順に並べ替えることができます。

ストリームをコレクションに戻す
場合によっては、ストリームに対して操作を実行した後、ストリームをコレクションに戻したい場合があります。これは、Collector オブジェクトを引数として受け取るcollect() メソッドを使用して行うことができます。

リスト filteredNames = names.stream()
.filter(name -> name.length() > 4) //長さが > の名前のみを保持します。 4
.collect(Collectors.toList()); // フィルタリングされた名前のリストを返します

collect() メソッドは、Collector タイプの関数インターフェイスを受け取り、それを使用して要素をコレクションに蓄積します。上の例では、Collectors クラスの toList() メソッドを使用して、フィルターされた名前のリストを作成しました。

ストリームに対するその他の操作
並べ替えやフィルター処理以外にも、マッピング、削減、反復など、ストリームに対して実行できる操作があります。これらの操作により、ストリーム内の要素をそれぞれ変換、削減、反復処理することができます。

一連の数値をマッピングして削減します
数値のリストがあり、すべての偶数の合計を求めたいとします。これは、map() メソッドとreduce() メソッドを使用して実行できます。

リスト数値 = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int sum =numbers.stream()
.filter(num -> num % 2 == 0) //奇数を除外します
.map(num -> num * 2) //偶数を2倍にします
.reduce(0, (a, b) -> a + b); //すべての数値を加算します

ここでは、map() メソッドを使用してストリーム内の偶数を 2 倍にし、次に、reduce() メソッドを使用してすべての数値を加算しました。結果は、リスト内のすべての偶数の合計です。

ストリームに対する操作を再利用する
場合によっては、複数のストリームで同じ機能操作を使用する必要があるかもしれません。同じコードを何度も書くことを避けるために、関数型インターフェイスを作成し、それを引数としてメソッドに渡すことができます。

名前のリストを姓で並べ替える例を見てみましょう。 Comparator インターフェイスを実装するコンパレータ クラスを作成し、それを引数としてsorted() メソッドに渡すことができます。

静的クラス LastNameComparator は Comparator を実装します。 {
@オーバーライド
public int Compare(文字列名1, 文字列名2) {
String[] Parts1 = name1.split(" ");
文字列 lastName1 = Parts1[parts1.length - 1];
String[] Parts2 = name2.split(" ");
文字列 lastName2 = Parts2[parts2.length - 1];
return lastName2.compareTo(lastName1);
}
}

names.stream().sorted(new LastNameComparator()).forEach(System.out::println); //出力: エミリー、デイビッド、ジョン、メアリー、トム

ここでは、名前を姓で並べ替えるために、LastNameComparator を引数としてsorted() メソッドに渡しています。

結論
Java のストリームとラムダは、コレクションに対して関数操作を実行するための強力かつ効率的な方法を提供します。これらにより、開発者はクリーンで簡潔、かつ再利用可能なコードを作成できます。ストリームとラムダの概念を理解することで、全体的なコーディング スキルを向上させ、より効率的なコードを作成できます。

Java スキルを向上させる効果的な方法の 1 つは、最新の Java 認定資格を取得し、MyExamCloud で利用できる 1Z0-830 模擬テストを使用することです。

以上がJava のストリームとラムダ: 例を含む関数型プログラミングのガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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