blog

Java8 機能的インターフェースの新機能

Lambdaはどのような場合に使用できますか? 一般的に、Lambda式は関数型インターフェースで使用されます。関数型インターフェースはJava 8で導入され、シンプルな説明で、関数型インターフェース...

Oct 27, 2020 · 8 min. read
シェア

Lambdaはどのような場合に使用できますか? 一般的に、Lambda式は関数型インターフェースで使用されます。関数型インターフェースはJava 8で導入されましたが、その説明は簡単です:関数型インターフェースとは、抽象メソッドを1つだけ持ち、抽象でないメソッドを複数持つことができるインターフェースのことです。

I. 文法上の定義

/**
* 機能インターフェースの定義
* このインターフェースは@FunctionalInterface  
*/
@FunctionalInterface
public interface ICollectionService {
 /**
 * printメソッドを定義する
 */
 void print();
}

Java 8以前には、以下のように多くの機能的インターフェースが存在していました:

  • java.lang.Runnable
  • java.util.concurrent.Callable
  • java.security.PrivilegedAction
  • java.io.FileFilter
  • java.nio.file.PathMatcher
  • java.lang.reflect.Invocationhondra
  • java.beans.PropertyChangeListener
  • java.awt.event.ActionListener
  • javax.swing.event.ChangeListener

Java8に追加された新しい関数型インターフェースはjava.util.functionパッケージの下にあり、Javaの関数型プログラミングをサポートする多くのクラスが含まれています:

1**BiConsumer**は、2つの入力パラメーターを受け取り、結果を返さない操作を表します。
2**BiFunction**は、2つの入力パラメーターを受け取り、結果を返すメソッドを表します。
3**BinaryOperator**は、同じ型の2つの演算子に作用し、演算子と同じ型の結果を返す演算を表します。
4**BiPredicate**は、2つの引数を持つブール値のメソッドを表します。
5BooleanSupplierは、ブール値の結果の提供者を表します。
6**Consumer**は、入力パラメータを受け取り、何も返さない操作を表します。
7DoubleBinaryOperatorは、2 つの二重値演算子に作用し、二重値の結果を返す演算を表します。
8DoubleConsumerは、二重値の引数を受け取り、結果を返さない操作を表します。
9**DoubleFunction**は、二重値の引数を取り、結果を返すメソッドを表します。
10DoublePredicateは、二重値の引数を持つ真偽値メソッドを表します。
11DoubleSupplierは、2 値構造体の提供者を表します。
12DoubleToIntFunctionは double 型の入力を受け付け、int 型の結果を返します。
13DoubleToLongFunctionは double 型の入力を受け取り、long 型の結果を返します。
15**関数**は入力パラメータを取り、結果を返します。
16IntBinaryOperatorは、同じint型の2つのパラメータを受け入れ、戻り値もint型です。
17IntConsumerは、戻り値のない int 型の入力パラメータを受け付けます。
18**IntFunction**は、int型の入力パラメータを受け取り、結果を返します。
19IntPredicate:int型の入力パラメータを受け取り、boolean型の結果を返します。
20IntSupplier は引数を取らず、int 型の結果を返します。
21IntToDoubleFunctionは int 型の入力を取り、double 型の結果を返します。
22IntToLongFunctionは int 型の入力を受け付け、long 型の結果を返します。
23IntUnaryOperatorはint型のパラメータを1つ受け取り、戻り値もint型です。
24LongBinaryOperatorは、同じ long 型の 2 つのパラメータを受け取ります。
25LongConsumerは、戻り値のない long 型の入力パラメータを受け付けます。
26**LongFunction**はlong型の入力パラメータを取り、結果を返します。
27LongPredicateRは、long型の入力パラメータを受け取り、boolean型の結果を返します。
28LongSupplier は引数を取らず、result long 型の値を返します。
29LongToDoubleFunctionは long 型の入力を受け付け、double 型の結果を返します。
30LongToIntFunctionは long 型の入力を受け付け、int 型の結果を返します。
31LongUnaryOperatorは long 型のパラメータを 1 つ受け取り、戻り値も long 型です。
32**ObjDoubleConsumer**は、返り値を持たない、object型とdouble型の1つの入力パラメータを受け付けます。
33**ObjIntConsumer**は、object型の入力パラメータを1つ、戻り値のないint型の入力パラメータを1つ受け入れます。
34**ObjLongConsumer**は、object型とlong型の1つの入力パラメータを受け付けます。
35**述語**は入力パラメータを取り、ブール値の結果を返します。
36**Supplier**はパラメータを持たず、結果を返します。
37**ToDoubleBiFunction**は、2つの入力パラメータを受け取り、double型の結果を返します。
38**ToDoubleFunction**は、入力パラメータを受け取り、double型の結果を返します。
39**ToIntBiFunction**は2つの入力パラメータを受け取り、int型の結果を返します。
40**ToIntFunction**は、入力パラメータを受け取り、int型の結果を返します。
41**ToLongBiFunction**は2つの入力パラメータを取り、long型の結果を返します。
42**ToLongFunction**は入力パラメータを取り、long型の結果を返します。
43**UnaryOperator**はT型のパラメータを1つ受け取り、戻り値の型もT型です。

上部を左に指をスライドさせると全体が表示されます。

Java8では非常に多くの関数型インターフェースが提供されていますが、開発でよく使われる関数型インターフェースは、述語、消費者、関数の3つです。

II.機能的インターフェースの例

, Supplier

java.util.function.Predicateインターフェイスは、一般的なTオブジェクトを受け入れ、ブール値を返すtestと呼ばれる抽象メソッドを定義しています。このインターフェイスは、T型を含むブール式を表現する必要がある場合に使用できます。

述語インターフェイスを使った文字列のヌル化

@FunctionalInterface
public interface Predicate<T> {
 /**
 * Evaluates this predicate on the given argument.
 *
 * @param t the input argument
 * @return {@code true} if the input argument matches the predicate,
 * otherwise {@code false}
 */
 boolean test(T t);
 ...
}
public static void main(String[] args) {
 /**
 * ラムダ式で述語テストメソッドを実装する
 */
 Predicate<String> p01=(str)->str.isEmpty()
str.trim().isEmpty();
 /**
 * 入力された文字列が NULL かどうかをテストする
 */
 System.out.println(p01.test(""));
 System.out.println(p01.test(" "));
 System.out.println(p01.test("admin"));
}

新しいJava情報プラス衛星:lezijie007は、コード13を入力して、あなたが得ることができます!

テスト結果

,

java.util.function.Consumerインタフェースは、acceptと呼ばれる抽象メソッドを定義しています。T型のオブジェクトにアクセスして何らかの操作を行う必要がある場合、このインターフェイスを使用することができます。

Consumerを使ったコレクション走査操作の実装

@FunctionalInterface
public interface Consumer<T> {
 /**
 * Performs this operation on the given argument.
 *
 * @param t the input argument
 */
 void accept(T t);
 ...
}
/**
* ラムダ式を使ってConsumerのacceptメソッドを実装する
*/
Consumer<Collection> c01 = (collection) -> {
if (null != collection && collection.size() > 0) {
for (Object c : collection) {
System.out.println(c);
}
}
};
List<String> list = new ArrayList<String>();
list.add(" ");
list.add(" ");
list.add(" ");
// リストを反復処理し、要素の内容をコンソールに出力する。
c01.accept(list);

、Function

java.util.function.Function インターフェイスはapplyと呼ばれるメソッドを定義しており、これは汎用型Tのオブジェクトを受け取り、汎用型Rのオブジェクトを返します。入力を出力にマッピングするラムダを定義する必要がある場合、関数型インタフェースと呼ばれるこのインタフェースを使うことができます。

Functionを使用して、ユーザーパスワードのBase64暗号化を実装します。

@FunctionalInterface
public interface Function<T, R> {
 /**
 * Applies this function to the given argument.
 *
 * @param t the function argument
 * @return the function result
 */
 R apply(T t);
}
// ユーザーパスワードのBase64暗号化操作を実装する
Function<String,String> f01=(password)->Base64.getEncoder().encodeToString(password.getBytes());
// 暗号化された文字列を出力する
System.out.println(f01.apply(""));

暗号化後の結果は以下の通り:

、Supplier

java.util.function.Supplierインターフェイスは、引数を取らず、汎用型Tのオブジェクトを返すgetの抽象メソッドを定義しています。

を作成する SessionFactory を実装するために Supplier を使用します。

@FunctionalInterface
public interface Supplier<T> {
 /**
 * Gets a result.
 *
 * @return a result
 */
 T get();
}
/**
* セッションファクトリーオブジェクトを生成する
*/
Supplier<SessionFactory> s = () -> {
 return new SessionFactory();
};
s.get().info();

Read next

プロトタイプ

nullは「対象がない」、つまりそこには価値がないはずだという意味です。 ちなみに、ダイアグラム内の相互に関連するプロトタイプの連鎖はプロトタイプ・チェーンで、これは青い線です。

Oct 26, 2020 · 1 min read