Javaラムダ式入門:基本から実践まで徹底解説
Javaにおけるラムダ式の使い方
「メソッドの中身は1行で済むのに、Javaの冗長な宣言構文のせいでコードが長くなってしまう……」と感じたことはありませんか?同じように感じている開発者は、決してあなただけではありません。
メソッドはプログラミングにおいて非常に便利な機能です。
メソッドとは、プログラム内で特定の処理を行うコードのまとまりのことです。一度メソッドを定義すれば何度でも呼び出せるため、コードの重複を減らすことができ、結果としてコードの保守性向上にもつながります。
このガイドでは、Javaのラムダ式について解説します。ラムダ式は、関数型インターフェースを実装するために使える特殊なメソッドの一種です。その仕組みと、なぜ使われるのかを詳しく見ていきましょう。
関数型インターフェースとは?
ラムダ式について学ぶ前に、まず関数型インターフェースを理解しておく必要があります。関数型インターフェースとは、抽象メソッドを1つだけ持つインターフェースのことです。この唯一の抽象メソッドが、そのインターフェースの目的を表します。
次の例を見てみましょう。
interface CalculateThree {
double multiply_by_three(String day);
}
ここでは、CalculateThreeというインターフェースを作成しました。このインターフェースにはmultiply_by_threeという1つのメソッドしか存在しないため、関数型インターフェースであると言えます。
Javaのラムダ式とは?
ラムダ式とは、名前を持たないメソッド(無名メソッド)のことです。関数型インターフェース内で定義されたメソッドを実装するために使用されます。名前を持たないことから、「匿名メソッド」と呼ばれることもあります。
ラムダ式はアロー演算子(->)を使用し、これによって2つの部分に分けられます。
(パラメータリスト) -> ラムダ本体
左側にはラムダ式が使用するパラメータを記述し、右側にはラムダ式が実行されたときに走るコードを記述します。ラムダ式は、単一のパラメータでも複数のパラメータでも受け取ることが可能です。
ラムダ式の使い方
それでは、ユーザーが入力した数値を受け取り、3倍にして表示するプログラムを作成してみましょう。まず、ユーザーから数値を受け取るコードを書きます。
import java.util.Scanner;
class Main {
public static void main(String args[]) {
Scanner user_input = new Scanner(System.in);
System.out.println("Insert a number to multiply by three: ");
double user_number = user_input.nextDouble();
}
}
このコードを実行すると、ユーザーに対して3倍したい数値の入力を求めるプロンプトが表示され、プログラムはその数値を「user_number」変数に読み込みます。Scannerクラスの仕組みについて詳しく知りたい方は、Java Scannerに関するチュートリアルも参考にしてください。
次に、数値を3倍するラムダ式を定義します。以下のコードをmainメソッドの上に追加してください。
interface CalculateThree {
double multiply_by_three(double number);
}
このコードは、ラムダ式が参照するインターフェースを定義しています。続いて、クラス内のmainメソッドの末尾に以下のコードを追加しましょう。
CalculateThree multiply = (number) -> number * 3; double answer = multiply.multiply_by_three(user_number); System.out.println(user_number + " multiplied by three is " + answer);
ここでは、CalculateThreeインターフェースを使って「multiply」という変数を宣言しました。この変数にラムダ式のコードが格納されます。ラムダ式は、multiply_by_threeがインターフェース内の唯一の関数であるため、自動的にCalculateThreeインターフェースのmultiply_by_threeに関連付けられます。
その後、ドット記法を使ってこの関数を呼び出しています。
multiply.multiply_by_three(user_number);
ドット記法とは、参照したいクラス名やインターフェース名を指定し、その後にドット(.)を続け、さらにアクセスしたいメソッド名を記述する方法です。この場合、「multiply」変数の中にあるmultiply_by_threeメソッドにアクセスしています。
最終的なコード全体は以下のようになります。
import java.util.Scanner;
interface CalculateThree {
double multiply_by_three(double number);
}
class Main {
public static void main(String args[]) {
Scanner user_input = new Scanner(System.in);
System.out.println("Insert a number to multiply by three: ");
double user_number = user_input.nextDouble();
CalculateThree multiply = (number) -> number * 3;
double answer = multiply.multiply_by_three(user_number);
System.out.println(user_number + " multiplied by three is " + answer);
}
}
それでは、コードを実行して「3」を入力してみましょう。
Insert a number to multiply by three: 3 3.0 multiplied by three is 9.0
コードは正常に動作し、入力した数値が3倍されて出力されました。この処理は、私たちが定義したラムダ式によって実行されています。
ブロック形式のラムダ式の使い方
ラムダ式には、単一式を使用する形式と、ブロックを使用する形式の2種類があります。ブロック形式の構文は、アローの右側のコードが複数行にわたる場合に使用します。
ブロック構文では、ラムダ式の右側のコードを波括弧({})で囲みます。
次の例を見てみましょう。
interface GreetUser {
String welcome_user(String name);
}
class Main {
public static void main(String args[]) {
GreetUser send_greeting = (name) -> {
System.out.println("Good morning!");
System.out.println("Welcome, " + name);
};
System.out.println(send_greeting.welcome_user("Brad"));
}
}
ここでは、send_greetingというラムダ式を宣言しました。この式は、プログラムの冒頭で定義したGreetUserインターフェースを参照しています。このラムダ式は、次の2つの処理を行います。
- コンソールに「Good morning!」と出力する
- コンソールに「Welcome, 」とユーザーの名前を出力する
この処理が2行のコードにわたるため、ブロック構文を採用しています。ラムダ式の右側のコードが波括弧で囲まれている点に注目してください。
まとめ
ラムダ式とは、関数型インターフェースを実装するための無名メソッドです。名前を持たず、単独では実行されないことから、「匿名クラス」や「匿名関数」と呼ばれることもあります。
最後に、少し挑戦してみませんか?ある数値が偶数かどうかを判定するラムダ式を書いてみてください。偶数の場合は「X is even」(Xは判定対象の数値)、奇数の場合は「X is odd」とコンソールに出力されるようにしましょう。
これで、あなたもJavaのラムダ式をエキスパートのように扱う準備が整いました!
-
Javaコンパイラ入門:仕組みの解説と初心者におすすめのオンラインIDE
5〜10年前、Javaを学ぶのは今ほど手軽なことではありませんでした。当時は、コンパイラとインタプリタを含むJava Development Kit(JDK)をダウンロードし、自分のマシン上で実行環境を整える必要がありました。しかし現在では、無料で利用できるJavaコンパイラがオンライン上に数多く存在します。この記事では、Java言語のコンパイルの仕組みと、練習やプロジェクト作成に活用できるオンラインツールについて詳しく解説します。 Javaプログラムはどのように実行されるのか? Javaは完全なコンパイル型言語ではありません。しかし、かといって完全なインタプリタ型言語でもありません。 ここ
-
Javaのインターフェースとは?基本構文からクラスとの違いまで徹底解説
Javaのインターフェースとはインターフェースは、Javaにおける参照型の一つで、クラスとよく似た性質を持っています。その本体は抽象メソッドの集まりであり、クラスがインターフェースを実装することで、その抽象メソッドを引き継ぐ仕組みになっています。抽象メソッドに加えて、インターフェースには定数、デフォルトメソッド、静的メソッド、ネストされた型を含めることも可能です。ただし、メソッドの本体(処理内容)が存在するのは、デフォルトメソッドと静的メソッドのみです。インターフェースの記述方法はクラスと似ていますが、両者の役割は異なります。クラスがオブジェクトの属性や振る舞いを記述するのに対し、インターフェ