Java 8 関数型インターフェース
関数型インターフェース(Functional Interface)とは、抽象メソッドを1つだけ持ち、ただし非抽象メソッドは複数持つことができるインターフェースのことです。
関数型インターフェースはラムダ式に暗黙的に変換できます。
ラムダ式とメソッド参照(実際にはラムダ式とみなすこともできます)について。
例えば、次のように関数型インターフェースを定義した場合:
@FunctionalInterface
interface GreetingService
{
void sayMessage(String message);
}
その場合、ラムダ式を使用してそのインターフェースの実装を表すことができます(注:JAVA 8 以前は通常、匿名クラスで実装していました):
GreetingService greetService1 = message -> System.out.println("Hello " + message);
関数型インターフェースは、既存の関数に対してラムダ式を親しみやすくサポートします。
JDK 1.8 より前からある関数型インターフェース:
- java.lang.Runnable
- java.util.concurrent.Callable
- java.security.PrivilegedAction
- java.util.Comparator
- java.io.FileFilter
- java.nio.file.PathMatcher
- java.lang.reflect.InvocationHandler
- java.beans.PropertyChangeListener
- java.awt.event.ActionListener
- javax.swing.event.ChangeListener
JDK 1.8 で追加された関数型インターフェース:
- java.util.function
java.util.function には Java の関数型プログラミングをサポートする多くのクラスが含まれており、このパッケージには次の関数型インターフェースがあります。
| 番号 | インターフェース & 説明 |
|---|---|
| 1 | BiConsumer<T,U>
2つの入力引数を受け取り、結果を返さない操作を表します。 |
| 2 | BiFunction<T,U,R>
2つの入力引数を受け取り、結果を返すメソッドを表します。 |
| 3 | BinaryOperator<T>
同じ型の2つのオペランドに対する操作を表し、オペランドと同じ型の結果を返します。 |
| 4 | BiPredicate<T,U>
2つの引数を取り、boolean値を返すメソッドを表します。 |
| 5 | BooleanSupplier
boolean値の結果を提供することを表します。 |
| 6 | Consumer<T>
1つの入力引数を受け取り、結果を返さない操作を表します。 |
| 7 | DoubleBinaryOperator
2つのdouble値オペランドに対する操作を表し、double値の結果を返します。 |
| 8 | DoubleConsumer
double値の引数を受け取り、結果を返さない操作を表します。 |
| 9 | DoubleFunction<R>
double値の引数を受け取り、結果を返すメソッドを表します。 |
| 10 | DoublePredicate
double値の引数を持つboolean値メソッドを表します。 |
| 11 | DoubleSupplier
double値の結果を提供することを表します。 |
| 12 | DoubleToIntFunction
double型の入力を受け取り、int型の結果を返します。 |
| 13 | DoubleToLongFunction
double型の入力を受け取り、long型の結果を返します。 |
| 14 | DoubleUnaryOperator
引数の型がdoubleで、戻り値の型もdoubleです。 |
| 15 | Function<T,R>
1つの入力引数を受け取り、結果を返します。 |
| 16 | IntBinaryOperator
2つの引数の型がintで、戻り値の型もintです。 |
| 17 | IntConsumer
int型の入力引数を受け取り、戻り値はありません。 |
| 18 | IntFunction<R>
int型の入力引数を受け取り、結果を返します。 |
| 19 | IntPredicate
:int入力引数を受け取り、boolean値の結果を返します。 |
| 20 | IntSupplier
引数なしで、int型の結果を返します。 |
| 21 | IntToDoubleFunction
int型の入力を受け取り、double型の結果を返します。 |
| 22 | IntToLongFunction
int型の入力を受け取り、long型の結果を返します。 |
| 23 | IntUnaryOperator
引数の型がintで、戻り値の型もintです。 |
| 24 | LongBinaryOperator
2つの引数の型がlongで、戻り値の型もlongです。 |
| 25 | LongConsumer
long型の入力引数を受け取り、戻り値はありません。 |
| 26 | LongFunction<R>
long型の入力引数を受け取り、結果を返します。 |
| 27 | LongPredicate
long入力引数を受け取り、boolean型の結果を返します。 |
| 28 | LongSupplier
引数なしで、long型の結果を返します。 |
| 29 | LongToDoubleFunction
long型の入力を受け取り、double型の結果を返します。 |
| 30 | LongToIntFunction
long型の入力を受け取り、int型の結果を返します。 |
| 31 | LongUnaryOperator
引数の型がlongで、戻り値の型もlongです。 |
| 32 | ObjDoubleConsumer<T>
Object型とdouble型の入力引数を受け取り、戻り値はありません。 |
| 33 | ObjIntConsumer<T>
Object型とint型の入力引数を受け取り、戻り値はありません。 |
| 34 | ObjLongConsumer<T>
Object型とlong型の入力引数を受け取り、戻り値はありません。 |
| 35 | Predicate<T>
1つの入力引数を受け取り、boolean値の結果を返します。 |
| 36 | Supplier<T>
引数なしで、結果を返します。 |
| 37 | ToDoubleBiFunction<T,U>
2つの入力引数を受け取り、double型の結果を返します。 |
| 38 | ToDoubleFunction<T>
1つの入力引数を受け取り、double型の結果を返します。 |
| 39 | ToIntBiFunction<T,U>
2つの入力引数を受け取り、int型の結果を返します。 |
| 40 | ToIntFunction<T>
1つの入力引数を受け取り、int型の結果を返します。 |
| 41 | ToLongBiFunction<T,U>
2つの入力引数を受け取り、long型の結果を返します。 |
| 42 | ToLongFunction<T>
1つの入力引数を受け取り、long型の結果を返します。 |
| 43 | UnaryOperator<T>
引数の型がTで、戻り値の型もTです。 |
関数型インターフェースの例
Predicate <T> インターフェースは関数型インターフェースであり、入力引数 T を受け取り、boolean値の結果を返します。
このインターフェースには、Predicateを他の複雑なロジック(たとえば、AND、OR、NOT)に組み合わせるための複数のデフォルトメソッドが含まれています。
このインターフェースは、オブジェクトが true か false かをテストするために使用されます。
次の例(Java8Tester.java)を通じて、関数型インターフェース Predicate <T> の使用法を理解できます。
Java8Tester.java ファイル
上記のスクリプトを実行すると、出力結果は次のとおりです:
$ javac Java8Tester.java $ java Java8Tester 输出所有数据: 1 2 3 4 5 6 7 8 9 输出所有偶数: 2 4 6 8 输出大于 3 的所有数字: 4 5 6 7 8 9
その他の拡張
Java 8 新機能