JLambda 式と Stream API

JavaBeginner
オンラインで実践に進む

はじめに

この実験では、Java 8 の 2 つの最も重要な機能であるラムダ式と Stream API の使い方を学びます。ラムダ式は、他のメソッドに引数として渡すことができる匿名関数を作成するために使用されます。一方、Stream API は、コレクションに対して一連の操作を実行するために使用されます。

Java 環境をセットアップする

まず、システムに最新版の Java をインストールすることで Java 環境をセットアップします。公式サイトから Java をダウンロードしてインストールできます。インストール後、ターミナルを開き、Java のバージョンを確認します。

java -version

Java ファイルを作成する

次に、~/project ディレクトリに新しい Java ファイル LambdaExpressions.java を作成します。

touch ~/project/LambdaExpressions.java

このファイルには、ラムダ式と Stream API を実装するコードを記述します。

ラムダ式を使って 2 つの数の和を計算する

ラムダ式は、匿名関数を作成する簡単な方法を提供します。二つの数を入力として受け取り、それらの和を返す関数を表す FunctionalInterface を作成します。

interface Calculator {
  int sum(int a, int b);
}

次に、ラムダ式を使ってこのインターフェイスのオブジェクトを作成し、そのオブジェクトを使って sum() 関数を呼び出すことができます。

  Calculator adder = (a, b) -> a + b;
  int result = adder.sum(10, 20);
  System.out.println("Result: " + result);

次に、以下のコマンドを使ってこのコードをコンパイルして実行します。

javac ~/project/LambdaExpressions.java && java LambdaExpressions

出力は以下のようになるはずです。

Result: 30

Stream API を使ってコレクションを反復処理する

Stream API は、コレクションに対して一連の操作を実行するために使用されます。このステップでは、文字列のコレクションを反復処理し、「A」で始まる文字列をフィルタリングする方法を学びます。

操作対象となるいくつかの名前を含む文字列のリストを作成します。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave", "Andy");

次に、Stream API を使ってこのコレクションを反復処理し、「A」で始まる文字列をフィルタリングし、残りの文字列をコンソールに出力します。

  names.stream().filter(s -> s.startsWith("A")).forEach(System.out::println);

次に、以下のコマンドを使ってこのコードをコンパイルして実行します。

javac ~/project/LambdaExpressions.java && java LambdaExpressions

出力は以下のようになるはずです。

Alice
Andy

整数のリストから最大値と最小値を見つけるために Stream API を使用する

Stream API は、コレクションに対して一連の操作を行う方法を提供します。このステップでは、Stream API を使って整数のリストから最大値と最小値を求める方法を学びます。

整数のリストを作成します。

List<Integer> numbers = Arrays.asList(10, 2, 30, 5, 4, 20);

Stream API を使ってリストの最大値を求めます。

Optional<Integer> maxNum = numbers.stream().max(Integer::compareTo);
System.out.println("Maximum number: " + maxNum.get());

Stream API を使ってリストの最小値を求めます。

Optional<Integer> minNum = numbers.stream().min(Integer::compareTo);
System.out.println("Minimum number: " + minNum.get());

次に、以下のコマンドを使ってこのコードをコンパイルして実行します。

javac ~/project/LambdaExpressions.java && java LambdaExpressions

出力は以下のようになるはずです。

Maximum number: 30
Minimum number: 2

リストの要素を表示するために forEach() を使用する

Stream API の forEach() メソッドを使って、リストを反復処理し、各要素に対してアクションを実行することができます。

操作対象となるいくつかの名前を含む文字列のリストを作成します。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave");

forEach() メソッドを使ってリストのすべての要素を出力します。

names.stream().forEach(System.out::println);

次に、以下のコマンドを使ってこのコードをコンパイルして実行します。

javac ~/project/LambdaExpressions.java && java LambdaExpressions

出力は以下のようになるはずです。

Alice
Bob
Charlie
Dave

コレクションをソートするために Stream API を使用する

Stream API を使ってコレクションをソートすることができます。このステップでは、整数のリストを昇順にソートする方法を学びます。

操作対象となる整数のリストを作成します。

List<Integer> numbers = Arrays.asList(1, 3, 2, 4, 5);

Stream API の sorted() メソッドを使ってリストを昇順にソートします。

numbers.stream().sorted().forEach(System.out::println);

次に、以下のコマンドを使ってこのコードをコンパイルして実行します。

javac ~/project/LambdaExpressions.java && java LambdaExpressions

出力は以下のようになるはずです。

1
2
3
4
5

コレクションをフィルタリングしてソートするために Stream API を使用する

このステップでは、Stream API を使って整数のコレクションをフィルタリングしてソートします。

操作対象となる整数のリストを作成します。

List<Integer> numbers = Arrays.asList(10, 2, 30, 5, 4, 20);

偶数のみをフィルタリングし、sorted() メソッドを使って降順にソートします。

numbers.stream().filter(n -> n % 2 == 0).sorted(Comparator.reverseOrder()).forEach(System.out::println);

次に、以下のコマンドを使ってこのコードをコンパイルして実行します。

javac ~/project/LambdaExpressions.java && java LambdaExpressions

出力は以下のようになるはずです。

30
20
10
4
2

コレクションの平均値を取得するために Stream API を使用する

このステップでは、Stream API を使って整数のコレクションの平均値を求める方法を学びます。

操作対象となる整数のリストを作成します。

List<Integer> numbers = Arrays.asList(10, 2, 30, 5, 4, 20);

Stream API の average() メソッドを使ってリストの平均値を求めます。

OptionalDouble avg = numbers.stream().mapToInt(Integer::intValue).average();
System.out.println("Average: " + avg.getAsDouble());

次に、以下のコマンドを使ってこのコードをコンパイルして実行します。

javac ~/project/LambdaExpressions.java && java LambdaExpressions

出力は以下のようになるはずです。

Average: 12.0

Optional オブジェクトを作成し、それが空かどうかを確認する

このステップでは、Optional とは何か、および Optional オブジェクトを作成する方法を学びます。

空の文字列を持つ Optional オブジェクトを作成します。

Optional<String> emptyString = Optional.empty();

isPresent() メソッドを使ってこのオブジェクトが空かどうかを確認します。

if(emptyString.isPresent()) {
    System.out.println(emptyString.get());
}
else {
    System.out.println("No value");
}

次に、以下のコマンドを使ってこのコードをコンパイルして実行します。

javac ~/project/LambdaExpressions.java && java LambdaExpressions

出力は以下のようになるはずです。

No value

まとめ

この実験では、Java 8 の最も重要な機能の 2 つであるラムダ式と Stream API の使い方を学びました。ラムダ式を使って匿名関数を作成する方法、コレクションに対して一連の操作を行うために Stream API を使う方法、および Optional オブジェクトを作成してそれが空かどうかを確認する方法を学びました。また、Stream API を使ってコレクションをソート、フィルタリングして平均値を求める方法も見ました。これらの機能をマスターすることで、Java 8 を使って効率的でクリーンなコードを書くことができます。