Javaの関数型インターフェースについて学習したのでまとめてみます。
関数型インターフェースとは
関数型インターフェースとは、抽象メソッドを持ったインターフェースです。
役割としては、
抽象メソッドを一つだけドを一つだけ持っているもの。l
そして、その抽象メソッドはラムダ式等を使って呼び出していきます。
そもそものインターフェースとは、開発においてどこのクラスでも必要なメソッドをまとめて置くためのものです。そして、関数型インターフェースは、抽象メソッドを一つだけ定義しているインターフェースです。
抽象メソッドとは何かというと、処理の内容が無いメソッドです。
関数型インターフェースの書き方
public interface SampleInterface {
public void Sm1(String sample);
}
このように、インターフェースの中に抽象メソッドを定義します。
さらにわかりやすく書くやり方もあります。
それは、アノテーションを宣言することです
@FunctionalInterface
public interface SampleInterface {
public void Sm1(String sample);
}
このようにすることで、更にわかりやすく書くことができます。
関数型インターフェースのメリット
抽象メソッドを使う時にインターフェースでまとめることができる。
というのがあります。
抽象メソッド海苔店としては、そのメソッドに対してオーバーライドを強制することができます。
なので、オーバーライドされる側のサブクラスの処理が使用されるたびに変えることができます。
そのメソッドをインターフェースとして使うことができるというのが、関数型インターフェースのメリットです。
そして、関数型インターフェースには、便利な機能がいくつかあります。
今回はその代表的な例を紹介したいと思います。
Consumerインターフェース
Consumerは、値を引数として与えます。
そして、その与えた値に対する返り値はありません。まさに名前の通りConsumer(消費者)ですね。
そして、2つのメソッドをConsumerではサポートしています。
1. accept()
2. andThen()
になります。今回はandThenは解説しません。理由は、わからんから。
##実際の書き方(accept編)
import java.util.function.Consumer;
をJavaのファイルに書き込むことで、Consumerインターフェースを呼び出します。
そして、ラムダ式でConsumerにアクセスします。
そのラムダ式が以下です
Consumer<型> 変数名 = 引数 -> {処理内容};
実際に書くと
Consumer<Integer> consumer = num -> System.out.println("accept()で渡したnumの値 : " + num);
のようになります。
そこに対して、引数で値を渡していきます。
渡すときは、
ラムダ式でつけた変数名.accept(引数);
になります。
書いてみると、
consumer.accept(10);
になります。
全体のコード
import java.util.function.Consumer;
public class Main {
public static void main (String[] args) {
Consumer<Integer> consumer = num -> System.out.println("accept()で渡したnumの値 : " + num);
consumer.accept(10);
}
}
このようにすることで、Consumerインターフェースを呼び出している変数consumerに10というInteger型の値を与えることができました。
実際に動かしてみると、
accept()で渡したnumの値 : 10
という結果が出てきました。
Predicateインターフェース
引数の値を受け取れい、True、もしくはFalseの値を返します。
値をBoolean型で判定したい時に役に立ちます。
以下、サンプルコード
import java.util.function.Predicate;
public class Main {
public static void main (String[] args) {
Predicate <String> test = testValue -> testValue.isEmpty(); //文字列は空文字か
System.out.println(test.test("2"));
}
}
まずはじめにImportをしてPredicateメソッドを呼び出します。こうすることで呼び出すことができます。
そして、ラムダ式で今回使うPredicateメソッドの型を宣言して、変数testにtestValueという名前の引数が殻かどうかの判定を行います。
そして、最後のSystem.out.println();
で変数testの中で引数を渡して判定をさせます。
出力結果は
false
になります。
Supplierインターフェース
Supplierインターフェースは、引数はなく戻り値のみのインターフェースです。
以下、サンプルコードです
import java.util.function.Supplier;
public class Main {
public static void main (String[] args) {
Supplier<String> test = () -> "Hello world";
String valueOfTest = test.get();
System.out.println(valueOfTest);
}
}
解説すると、importでSupplierを呼び出して、そこにラムダ式を使ってSupplierに"Hello world"の文字列を格納します。
それを呼び出している処理を変数valueOfTestに格納します
をSystem.out.println();で出力しています。
Functionインターフェース
Functionインターフェースは引数で渡した値を演算して返り値として返すためのものです。
サンプルコードは参照サイトから引用しました。
import java.util.function.Function;
public class JavaBiPredicate1 {
public static void main(String[] args) {
Function <Integer,String> make1 = a -> a + "です";
String b = make1.apply(2);
System.out.println(b); //2です
}
}
そして、importで呼び出して変数bでラムダ式make1に2というあたいを渡して上げてSystem.out.println();
を使って出力します。
参考サイト