関数型インタフェースの定義と記述を対策する
黒本の第2章は『関数型インタフェースとラムダ式』、この中にある関数型インタフェースの定義と記述について対策を進めていく。とりあえずは下記の6つに関して、コードと共に理解していく。
インタフェース | 英語の意味 | 戻り値型 | メソッド |
---|---|---|---|
Supplier |
提供者 | T | get() |
Consumer |
消費者 | void | accept(T) |
Predicate |
断定する | boolean | test(T) |
Function<T, R> | 関数 | R | apply(T) |
UnaryOperator |
単項演算子 | T | apply(T) |
BinaryOperator |
二項演算子 | T | apply(T, T) |
Supplier
Supplier(=提供者)という言葉が意味する通り、指定されたデータを提供するインタフェースである。ポイントは下記の2点。 1. 引数はなし(=void) 2. メソッドはget
public class Main { public static void main(String[] args) { Supplier<String> s = () -> "test"; System.out.println(s.get()); } }
実行結果
test
Consumer
Consumer(=消費者)という言葉が意味する通り、渡されたデータを消費するインタフェースである。ポイントは下記の2点。 1. 戻り値はなし(=void) 2. メソッドはaccept
public class Main { public static void main(String[] args) { Consumer<String> s = (str) -> System.out.println(str); s.accept("test"); } }
実行結果
test
Predicate
Predicate(=断定する)という言葉が意味する通り、渡されたデータが条件に合致するか断定するインタフェースである。ポイントは下記の2点。 1. 戻り値は判定結果(=boolean) 2. 実行メソッドはtest 3. and / or メソッドで複合条件の断定処理を実装可能
public class Main { public static void main(String[] args) { Predicate<Integer> s = (num) -> num==2; System.out.println(s.test(1)); System.out.println(s.test(2)); System.out.println(s.test(3)); } }
実行結果
false true false
andメソッドを利用することで下記のように複数の条件を組み合わせて判定することができる。
public class Main { public static void main(String[] args) { Predicate<Integer> t = (num) -> num>0; Predicate<Integer> u = (num) -> num<=10; // (0 < 9 <= 10) is TRUE System.out.println(t.and(u).test(9)); // (0 < 10 <= 10) is TRUE System.out.println(t.and(u).test(10)); // (0 < 11 <= 10) is FALSE System.out.println(t.and(u).test(11)); } }
実行結果
ture true false
orメソッドも利用することで下記のように複数の条件を組み合わせて判定することができる。
public class Main { public static void main(String[] args) { Predicate<Integer> t = (num) -> num>0; Predicate<Integer> u = (num) -> num<=10; // (0 < 9) OR (9 <= 10) is TRUE System.out.println(t.or(u).test(9)); // (0 < 10) OR (10 <= 10) is TRUE System.out.println(t.or(u).test(10)); // (0 < 11) OR (11 <= 10) is TRUE System.out.println(t.or(u).test(11)); } }
実行結果
ture true false
Function
Function(=関数)という言葉が意味する通り、インタフェースである。ポイントは下記の2点。 1. 引数と戻り値を指定する 2. メソッドはapply
public class Main { public static void main(String[] args) { Function<Integer, String> s = (num) -> "これは" + num + "です"; System.out.println(s.apply(1)); System.out.println(s.apply(2)); } }
実行結果
これは1です これは2です
UnaryOperator
UnaryOperator(=単項演算子)という言葉が意味する通り、一つの項を用いて一つの結果を得るインタフェースである。ポイントは下記の2点。 1. 引数と戻り値が同じ型 2. メソッドはapply
public class Main { public static void main(String[] args) { UnaryOperator<Integer> s = (num) -> num*num; System.out.println(s.apply(1)); System.out.println(s.apply(2)); } }
実行結果
1 4
BinaryOperator
BinaryOperator(=二項演算子)という言葉が意味する通り、二つの項を用いて一つの結果を得るインタフェースである。ポイントは下記の2点。 1. 引数と戻り値が同じ型 2. メソッドはapply
public class Main { public static void main(String[] args) { BinaryOperator<Integer> s = (num1, num2) -> num1*num2; System.out.println(s.apply(1,2)); System.out.println(s.apply(2,3)); } }
実行結果
2 6
まとめ
FunctionとUnaryOperatorとBinaryOperatorは『戻り値と引数の関係性が違う』だけで、実施メソッドは同じapplyである。
- UnaryOperatorは一つの引数で一つの結果を得られ、BinaryOperatorは二つの引数で一つの結果を得られる。また引数と戻り値の型は同じ。
- ただしFunctionは一つの引数で一つの結果を得られ、引数と戻り値の型が同じとは限らない。