Lambda式の変数scope
- 람다식으로부터 억세스 가능한 것은 지역변수와 블록구의 파라미터 중에 final이거나 사실상 final 판정(effectively final)을 받은 것에 한정됩니다.
- 内部classやlambdaで外側で定義されているlocal variableを使う場合には そのローカル変数に暗黙にfinalが付いているもとみなす。
predicateと function
- predicateのreturn -> boolean
- functionのreturn -> result
java.util.functionパッケージ
Java 8は、汎用的に使える関数型インターフェースは「java.util.function」パッケージで用意しています。Java 8から追加された新しいメソッドで関数型インターフェースを引数に持つメソッドの多くは、引数にこのパッケージで用意した関数型インターフェースを使っています。
関数型インターフェースのパターン
java.util.functionパッケージのAPIを見てみると、幾つものインターフェースが追加されていて、うんざりする人がいるかもしれません。しかし、java.util.functionパッケージで用意されている関数型インターフェースは、受け取る引数と返す結果のパターンから大きく分けて4種類用意しています。そして、それらのインターフェース名からどのような処理を行うのかを分かりやすくするため、それらの性質に応じた名前が付けられています。
種類 | 実装するメソッド | 概要 |
---|---|---|
Function |
R apply(T t) | 実装するメソッドは、引数としてTを受け取り、結果としてRを返すものになる |
Consumer |
void accept(T t) | 実装するメソッドは、引数としてTを受け取り、結果を返さず終了するものになる |
Predicate |
boolean test(T t) | 実装するメソッドは、引数としてTを受け取り、boolean値を結果として返すものになる |
Supplier |
T get() | 実装するメソッドは、何も引数として受け取らず、結果としてTを返すものになる |
また、それらから拡張したものとして次の関数型インターフェースも汎用的に使われます。
種類 | 実装するメソッド | 概要 |
---|---|---|
Operator |
T apply(T t) | 実装するメソッドは、引数としてTを受け取り、結果としてTを返すものになる。Functionを拡張したもの |
これらの中でFunction、Consumer、Predicate、Supplierはそれ自身の名前でインターフェースとして用意されていますが、Operatorだけの名前の関数型インターフェースはないので注意してください。その代わり、1つの引数を受け取るOperatorは「UnaryOperator
References
- 関数型プログラミングって何、ラムダってなんだよ
- java.util.function以下の関数インターフェース使い方メモ
- Java 8 Predicates and Functions
- chaining sampleなどがある