今回は、Javaでのラムダ式で利用する関数型インターフェースについてご紹介します。
初めて見る時にはラムダ式は理解しにくい内容ですが、この記事では初心者でもわかりやすいように実際のコーディング例も活用して解説します。
ラムダ式はJava Silverの試験にも出てくる内容になります。
また、Javaでのラムダ式の関数型インターフェースについて知識があると開発現場のコードにラムダ式が利用されている場合でも改修がしやすくなります。
開発現場で急にラムダ式を利用したコードが出てきたりするから知っておいて損はないで!
記事の信頼性:元教員の現役エンジニアの「しう」がJavaでのラムダ式のインターフェースについて書いています。
(ラムダ式の内容も勉強してJava Silverに合格もしています)
Javaでのラムダ式とは?
Javaのラムダ式(lambda expression)とは、関数を定義して、そのインスタンスをすぐに生成することです!
Java SE8から新しくできた機能ですが、これだけではラムダ式とは何のことかよくわからないと思います。
ラムダ式とは何なのかの詳しい解説については下記の記事で紹介しているので、気になる人は見てみてください。
ラムダ式の関数型インターフェースとは?
関数型インターフェースは、「関数型インターフェース」とは抽象メソッドが1つだけの抽象クラスのことです!
具体的には次のようなコードになります。
public interface MyInterface<T> {
void accept(T t);
}
acceptメソッドは具体的な処理内容が書いていないので、抽象メソッドになります。
ラムダ式を活用する時には、この関数型インターフェースを利用して実装をおこないます。
関数型インターフェースなしにはラムダ式は理解できへんで!
ラムダ式での標準的な関数型インターフェース
ラムダ式でよく使われる関数型インターフェースは次の4つになります!
- Consumer
- Supplier
- Predicate
- Function
これらの関数型インターフェースを利用する場合は、java.util.functionパッケージをimportする必要があります。
今回紹介する4つ以外にも様々な関数型インターフェースが用意されているので、気になる人はOracle公式ページで調べてみてください。
Consumer
ラムダ式での標準的な関数型インターフェースの1つ目はConsumerです!
Consumer:void accept(T t)
引数としてTを受け取り、結果を返さずに処理を終了します。
実際にJavaのラムダ式で利用する場合は次のようになります。
public class Main{
public static void main(String[] args) {
Consumer consumer = (s) -> {
System.out.println(s);
};
consumer.accept("プログラミング(Java)のお悩み解決ラボ!");
}
}
Consumerのacceptメソッドをラムダ式を用いてSystem.out.printlnの処理でオーバーライドしています。(Consumerを利用する場合はacceptメソッドを利用することが決まりとなっています)
その後に、Consumerのacceptメソッドを実行して、オーバーライドされたSystem.out.printlnの出力を実行しています。
Supplier
ラムダ式での標準的な関数型インターフェースの2つ目はSupplierです!
Supplier:T get()
引数は受け取らず、結果としてTを返します。
実際にJavaのラムダ式で利用する場合は次のようになります。
public class Main{
public static void main(String[] args) {
Supplier supplier = () -> {
return "プログラミング(Java)のお悩み解決ラボ!";
};
String dispMessage = (String) supplier.get();
System.out.println(dispMessage);
}
}
Supplierのgetメソッドの戻り値を、ラムダ式を用いてオーバーライドしています。
今回はsupplier.get()とコードを書くだけでは戻り値として、”プログラミング(Java)のお悩み解決ラボ!”が返ってくるだけなので利用できません。(get()は書くだけでは意味がないため)
出力(表示)をするためには例のようにdispMessageに戻り値を入れて、その後にdispMesasgeをSystem.out.printlnで表示する必要があります。
Predicate
ラムダ式での標準的な関数型インターフェースの3つ目はPredicateです!
Predicate:boolean test(T t)
引数を受け取り、結果としてbooleanを返します。
実際にJavaのラムダ式で利用する場合は次のようになります。
public class Main{
public static void main(String[] args) {
String dispMessage = "プログラミング(Java)のお悩み解決ラボ!";
Predicate predicate = (s) -> {
return (boolean) s;
};
boolean result = predicate.test(true);
if(result){
System.out.println(dispMessage);
}
}
}
Predicateのtestメソッドを、ラムダ式を用いてオーバーライドしています。
引数のs(trueもしくはfalse)の結果を返すように変更しています。
オーバーライドをしたtestメソッドを利用して、引数の結果をresultで受け取ります。
最後にresultがtrueの場合はdispMessageの内容を表示するようにしています。
(実際に開発現場でtrueをtestメソッドの引数で受け取る場合にはこのような書き方はしないですが、Predicateの説明のためにあえてこの書き方をしています。)
Function
ラムダ式での標準的な関数型インターフェースの4つ目はFunctionです!
Function:R apply(T t)
引数を受け取り、結果としてRの型で結果を返します。
実際にJavaのラムダ式で利用する場合は次のようになります。
public class Main{
public static void main(String[] args) {
Function function = (s) -> {
String dispMessage = s + "プログラミング(Java)のお悩み解決ラボ!";
return dispMessage;
};
System.out.println(function.apply("ラムダ式の解説:"));
}
}
Functionのapplyメソッドを、ラムダ式を用いてオーバーライドしています。
引数のsと”プログラミング(Java)のお悩み解決ラボ!”を結合した結果を返すように変更しています。
オーバーライドしたapplyメソッドを利用して、”ラムダ式の解説:”と”プログラミング(Java)のお悩み解決ラボ!”を結合した文字列を生成しています。
最後にSystem.out.printlnで結合した内容を表示しています。
(実際に結合内容を表示したい場合は、”ラムダ式の解説:”+”プログラミング(Java)のお悩み解決ラボ!”で事足りますが、ラムダ式の解説のためここでもこのように記載しています)
その他の関数型インターフェース
今回紹介した関数型インターフェース以外にもUnaryOperatorやBiConsumerなど様々な関数型インターフェースが存在します。
気になる人はJavaの公式HPにも記載があるので調べてみてくださいね。
まとめ
いかがでしたか?今回は、次の順番でJavaでのラムダ式でよく利用する関数型インターフェースについてご紹介しました。
- Javaでのラムダ式とは?
- ラムダ式の関数型インターフェースとは?
- ラムダ式での標準的な関数型インターフェース
- その他の関数型インターフェース
初めて見た時には理解しにくいラムダ式ですが、繰り返し学ぶことでわかるようになってきます。
もし、動画教材の方が理解しやすい場合は次のUdemyの講義でもJavaでのラムダ式について学ぶことができます。
また、ラムダ式書き方やメリットについて知りたい人は、ラムダ式の使い方(Java)【しうの備忘録】の記事が参考になるので見てみてくださいね。
☟あわせて読みたい 「しう」のオススメブログ
コメント