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」、2つの同じ型の引数を受け取るものは「BinaryOperator」のように定義されています。

References

results matching ""

    No results matching ""