今回は、Javaでのラムダ式の使い方についてご紹介します!
Javaを勉強し始めた時にはラムダ式に苦手意識を持つ人が多いですが、ラムダ式も仕組みがわかれば恐れる必要はありません。
Javaにおいて、ラムダ式はどのように使うことができるのか見ていきましょう!
Javaの勉強を始めたばかりなら、半年後にもう一度振り返ると理解がしやすいで!
記事の信頼性:未経験からIT企業の受託企業へ転職に成功。現役プログラマーの「しう」がJavaのラムダ式について書いています。
ラムダ式とは?【Java中級者向け】
Javaのラムダ式(lambda expression)とは、関数を定義して、そのインスタンスをすぐに生成することです!
Java SE8から新しくできた機能になりますが、この説明だけではラムダ式では何ができるのかなどよくわからないと思います。
( 引数 ) -> { 処理 }
という形が出てきたら、Javaのラムダ式だなという認識をまずは持っておきましょう!詳しい解説は、次からしていきます。
関数型インターフェース【ラムダ式に必ず必要!】
関数型インターフェースは、定義されている抽象メソッドが一つだけあるインターフェースのことです!
Javaのラムダ式を勉強する準備として、関数型インターフェースについて学びましょう。
ラムダ式の書き方としては次のようになります。
(@FunctionalInterfaceはなくても関数型インターフェースを利用できます)
@FunctionalInterface
public interface MyInterface<T> {
void accept(T t);
}
関数型インターフェースと明確にしたい場合は、次のようなアノテーションをつけます。
@FunctionalInterface
このようにすることで、関数型インターフェースの条件(定義されている抽象メソッドが一つ)を満たしていない場合、コンパイルエラーを表示してくれます。
とても大切なことやから、忘れへんようにしといてや!!!
ちなみに、①Consumer、②Supplier、③Predicate、④Functionなど、importするだけで利用できる関数型インターフェースもあります。
この関数型インターフェースについての内容については次の記事で詳しく解説しています。
ラムダ式の書き方【Java】
Javaでのラムダ式の書き方について見ていきましょう!
次の順に解説を読んでいくことで、よりラムダ式の理解を深めることができます。
- ラムダ式の構文
- ラムダ式以外の書き方では?
- ラムダ式の省略記法
ラムダ式の構文
Javaでのラムダ式の構文は次のようになります!
(型 引数名1, 型 引数名2, ・・・) -> {
処理1;
処理2;
return 戻り値;
}
先ほどの関数型インターフェースの項目のMyInterfaceを利用した具体例を出すと次のような形です。
MyInterface<String> lamdaInterface = (String inStr) -> {System.out.print(inStr)};
先ほどのMyInterfaceをオーバーライドしています。
メソッド名がついている場合は次のようなイメージになります。
MyInterface<String> lamdaInterface = accept(String inStr) -> {System.out.print(inStr)};
MyInterfaceのacceptメソッドの中身が
System.out.print(inStr)
にオーバーライドしています。
注意点としてラムダ式では、
(String inStr) -> {System.out.print(inStr)}
というようにどのメソッドか記載がありません。
関数型インターフェースのMyInterfaceでは抽象メソッドが一つだけなので、どのメソッドか記載する必要がないからです!
(指定しなくてもメソッドが一つしかないから、判断できるため)
そのため、ラムダ式では関数型インターフェースを利用することが必須条件になります。
また、実際に出力したい場合は次のようにすることで実行できるので、手順を理解しておきましょう。
lamdaInterface.accept("オーバーライドしたメソッドの実行");
ラムダ式と関数型インターフェースはセットで使うと覚えといてや!
ラムダ式以外の書き方では?
Javaでのラムダ式を使わずに書く方法もご紹介します!
ラムダ式以外の書き方を学ぶことで、文の意味を理解しやすくなります。
理解力向上のためにも頑張っていきましょう。
パターン1(implementsの利用)
まずは関数型インターフェースを継承したLamdaクラスを作成します。
public class Lambda implements MyInterface<String>{
public void accept(String inStr){
System.out.println(inStr);
}
その後、Lamdaクラスをインスタンス化して、acceptメソッドを呼び出します。
Lambda lambda = new Lambda();
lambda.accept("オーバーライド : パターン1");
パターン2(抽象メソッドをオーバーライド)
次のパターンは、抽象メソッドをオーバーライドする方法です。
MyInterface<String> myInterface = new MyInterface<String>(){
public void accept(String instr){
System.out.println(instr);
}
と書くことで、MyInterfaceのacceptメソッドをオーバーライドしています。
そして、acceptメソッドを呼び出すことで、メッセージの出力ができます。
myInterface.accept("オーバーライドの方法22");
ラムダ式とパターン1の比較
ラムダ式とパターン1の比較をして、ラムダ式の理解を深めましょう!
ラムダ式では次ように書きました。
MyInterface<String> lamdaInterface = (String inStr) -> {System.out.print(inStr)};
パターン1でここに該当するのは
public class Lambda implements MyInterface<String>{
public void accept(String inStr){
System.out.println(inStr);
}
になります。
ラムダ式を使うとスッキリして見えるね。
これがJavaのラムダ式のメリットでもあるわけやな!
※関数型インターフェースは、Consumer、Supplier、Predicate、FunctionなどImportするだけで利用できるものもあります。
この4つの標準的な関数型インターフェースについては次の記事で解説をしているので、気になる人は読んでみてくださいね。
ラムダ式の省略記法
ラムダ式の省略記法についてご紹介します!
ラムダ式では、ある条件を満たしている時に省略した書き方をすることができます。
例えば次のように書いている場合、引数宣言の型を省略することができます。
MyInterface<String> lamdaInterface = (int inStr) -> {return intStr * intStr };
引数のintを省略すると次のようになります。
MyInterface<String> lamdaInterface = (inStr) -> { return intStr * intStr };
また、ラムダ式の引数が一つの場合は丸カッコも省略可能です。
MyInterface<String> lamdaInterface = inStr -> { return intStr * intStr };
ラムダ式が単一のreturn文の場合、波カッコとreturnも省略可能です。
MyInterface<String> lamdaInterface = inStr -> intStr * intStr;
() -> {}の形の場合、ラムダ式になるとこの記事の一番最初に紹介しました。
しかし、ラムダ式にはカッコを省略できる場合もあるので気を付けていきましょう。
ラムダ式のメリット
ラムダ式のメリットは、次の2点になります。
- スッキリして見える
- クラスを見に行かなくてすむ
スッキリして見える
ラムダ式では1行でメソッドの内容を書くことができます。
そのため、記載しているコードが何をしているのか直感的にわかりやすいです。
書き方に慣れてしまえば、ラムダ式を使った書き方を採用することで保守性が高まりますね。
クラスを見に行かなくてすむ
クラスの内容をわざわざ見に行かなくてすむこともメリットです。
ラムダ式では、メソッドの内容も書かれているためクラスの記載内容を見に行かなくてもすみます。
このような小さなことの積み重ねでコーディングの効率を高めることができるので意識していきましょう。
stream API
Javaでラムダ式を使うメリットとして、Stream APIの存在があります。
Stream APIについては、現在勉強中になります。
こちらについては、今後執筆予定です。完成を楽しみにしてくださいね。
まとめ
いかがでしたか?今回は次の順番でJavaでの関数型インターフェースについてご紹介しました。
- ラムダ式とは?【Java中級者向け】
- 関数型インターフェース【ラムダ式に必ず必要!】
- ラムダ式の書き方【Java】
- ラムダ式のメリット
- stream API
ラムダ式も書き方に慣れると便利だなと感じてきます。
実際の開発現場にも出てくることがあり、使えないと他の人が書いたコードが読めないということになってしまうので学習していきましょう!
☟あわせて読みたい 「しう」のオススメブログ
コメント