Javaの8関数インタフェース詳細なチュートリアル

新しい新しいバイト= AYは[Array.lengthとである];
のために(INT I = 0;私は<Array.lengthとすること; Iは++){
transformedArray [I] = function.applyAsByte(配列[I]);
}
transformedArrayを返す;
}
。1
2
。3
。4
5
。6
。7
ここでは、2を乗じたバイト配列を変換する方法短い配列をテストします。

短い[]配列= {(短い)1、(ショート)2、(短い)3。。};
バイト[] transformedArray = transformArray(アレイ、S - >(バイト)(S * 2));

バイト[] expectedArray = { (バイト)2、(バイト)4、(バイト)} 6;
assertArrayEquals(expectedArray、transformedArray)
。1
2
3。
4。
5。
バイナリ関数はインタフェース
二つのパラメータを持つラムダ式を、我々は、キーワードのBiを含む名前を使用する必要が関数インタフェース:BiFunction、ToDoubleBiFunction、ToIntBiFunction、および ToLongBiFunction。

BiFunction一般的な2つのパラメータと戻り値、及び他の同様の機能とインターフェースToDoubleBiFunctionは、基本型を返すことができています。

典型的な例は、マップ値を用いて計算したすべての値を置換するバイナリラムダJDK Map.replaceAll法を用いて表されています。BiFunctionは、次のキーの受信を使用して実装して置き換え値が新しい値が計算されとり返します。

新しい新しい地図<文字列、整数> UALとの関係=はHashMap <>();
salaries.put( "ジョン"、40000);
salaries.put( "フレディ"、30000);
salaries.put( "サミュエル"、50000);

UAL関係。でReplaceAll((名前、OLDVALUE) - >
name.equals( "フレディ")OLDVALUE :? OLDVALUE + 10000)
。1
2
。3
。4
。5
。6
。7
サプライヤインターフェイス関数
パラメータなしでサプライヤインターフェースは、別の特別な形態です。遅延生成のための典型的な値。例えば、二重の価値平方関数の定義。それはではなく、値Supperlierとして、値を受け取りません。

ダブルsquareLazy公開(サプライヤー<ダブル> LazyValue){
Math.pow返す(lazyValue.getを()、2);
}
1
2
3。
遅延関数が達成値サプライヤを用いて生成することができます。これは、値を生成するのにかかる多くの時間のために非常に有用です。以下のシミュレートされたsleepUninterruptiblyを使用してグアバ方法:

サプライヤー<ダブル> LazyValue =() - > {
Uninterruptibles.sleepUninterruptibly(1000、TimeUnit.MILLISECONDS);
(d)を返す;
};

ダブルvalueSquared = squareLazy(LazyValueを)
。1
2
。3
。4
。5
。6
別の使用シナリオが定義されているサプライヤーストリームロジックのシーケンスを生成します。実証するために、我々は静的Stream.genernateフィボナッチ数値フローを作成するためのメソッドを使用します。

INT [] = {0のFIB ,. 1}、
ストリーム<整数> = Stream.generateフィボナッチ(() - > {
int型の結果=のFIB [1]、
[1] INT fib3のFIB = [0] +のFIB;
FIBS [0 ] = FIBS [1];
のFIB [1] = fib3;
リターン結果;
});
1
2
。3
。4
。5
。6
。7
。8
Stream.generate関数サプライヤなどのインターフェースの機能を渡す方法を実施しました。有用なビルダーであると、なお、サプライヤインターフェイスは、一般的にいくつかの外部の機能状態を必要とします。本実施形態では、最後の二つのフィボナッチ数桁によって、その状態。
すべての外部変数が最終でなければならないラムダ式で使用されるため、この状態を達成するために、我々は、配列ではなく、変数のセットを使用します。

その他の特殊関数インタフェースは、それぞれのタイプに戻り、サプライヤーBooleanSupplier、DoubleSupplier、LongSupplierとIntSupplierを備え、プリミティブ型です。

消費関数のインターフェース
とサプライヤーコントラスト、消費者インタフェースは、一般的なパラメータが、ノーリターン値を受け取ります。この関数は、代表的な副作用(変更されたパラメータから、ラムダ式は、パラメータを変更することはできません)です。

例えば、リスト内の各名前のコンソールグリーティングへ出力するようになっています。ラムダ式はList.forEach消費関数インターフェイスメソッドの実装を通過しました。

一覧<文字列> =は、Arrays.asList名( "ジョン"、 "フレディ"、 "サミュエル");
names.forEach(名- >のSystem.out.println( "こんにちは、" +名));
1。
2は
また、特定のバージョンを持っています消費者- DoubleConsumer、IntConsumerとLongConsumer、引数として受け取ったベースタイプ値。さらに興味深いのは、1つのシナリオは、エントリの反復マップで、BiConsumerポートです。

地図<文字列、整数> =新しい新規のAGEのHashMap <>();
ages.put( "ジョン"、25);
ages.put( "フレディ"、24);
ages.put( "サミュエル"、30);

のAGE。 forEachの((名前、年齢) - >のSystem.out.println(名+は+年齢+ "歳") "である");
1
2
3。
4。
5。
6。
別のインタフェースは、それぞれ特別なBiConsumer ObjDoubleConsumer、ObjIntConsumer、ObjLongConsumerの集合であります2つのパラメータを、受信の一つは、一般的であり、他方は基本型です。

機能インターフェース述語
数学的な論理では、述語値を受信し、ブール値を返す関数です。述語関数インターフェースは、ブール値を返し、ジェネリック型値を受け取る特殊機能インタフェースです。典型的なシナリオでは、フィルタ値の集合です。

一覧<文字列>名前=は、Arrays.asList( "アンジェラ"、 "アーロン"、 "ボブ"、 "クレア"、 "デビッド");

リスト<文字列> namesWithA = names.stream()
.filter(名- >名前。 startsWith( "A"))
.collect(Collectors.toList())
。1
2
。3
。4
。5
上記のコードでは、我々は、Aの先頭にAPIろ過流量値名リストを使用して、述語論理コード、すなわち濾過を実施しました。前の例、IntPredicate、DoublePredicate LongPredicateいくつかのインタフェースとベース型受信機等が挙げられます。

オペレータインタフェース機能の
オペレータインタフェース機能インタフェースは、特殊なケース、戻り値の型である、及びそれを受け取ります。UnaryOperatorインタフェースは、すべての値の置換リストコレクションAPIアプリケーションは、同じタイプの計算値を使用して、単一のパラメータを受け取ります。

一覧<文字列> =は、Arrays.asList名( "ボブ"、 "ジョシュ"、 "ミーガン");
names.replaceAll(名- > name.toUpperCase());
1つの。
2
List.replaceAll機能ボイド戻り値の型、それが交換されるので、特定の位置の値。この目的を達成するために、リストを変換するためのラムダ値は、その基準に結果の同じ種類を返さなければなりません。それはここに理由UnaryOperator便利です。当然の方法はまた、代わりに、基準ラムダを使用すること。

names.replaceAll(toUpperCaseの::文字列)
。1
最も興味深いユースケースにBinaryOperatorインタフェースは、操作を減らすことです。値および整数の集合を計算します。使用ストリームAPIを達成することができるが、より一般的な方法は、方法の使用を減らすことです。

リスト<整数> =は、Arrays.asList値(3 ,. 5 ,. 8 ,. 9、12である。);

INT values.stream = SUM()を低減(0、(I1、I2) - > I1 + I2);.
。1
2
3。
減らします初期積算値とBinaryOperator関数インタフェースを受信する方法。インターフェイスパラメータは、同じタイプの値のペアであり、両方の機能は、論理接続が同じタイプの値を達成するために参照される含みます。結合は、関数に渡されなければならない、すなわち、にかかわらず、以下の条件を満足しなければならないように順序価値計算:

op.apply(A、op.apply(B、C))== op.apply(op.apply(A、B)、C)
。1
結合機能、パラレルコンピューティングBinaryOperator容易こと。もちろん、UnaryOperatorとBinaryOperatorの基本的なタイプのため、DoubleUnaryOperatorという名前の順番に、IntUnaryOperator、LongUnaryOperator、DoubleBinaryOperator、 IntBinaryOperator とLongBinaryOperator。

伝統的な関数インタフェース
するJava 8からではないすべての関数インターフェース。インタフェース機能の以前のバージョンの条件を満たすために、多くのインターフェースは、ラムダ式として使用することができます。典型的な例は、API Runnableを、呼び出し可能パラレルインタフェースです。同時コードを大幅に簡略化されることができるJavaの8使用@FunctionalInterface、でこれらのインタフェースの標識:

スレッド新しい新しい=スレッドスレッド(() - 「ハローから別のスレッド」>のSystem.out.printlnを());
Thread.start();
1。
2
にまとめ
ここでは、我々は、異なるインタフェースでラムダ式としての機能を提供するJava APIの説明一例として、アプリケーションシナリオを示すために。
--------------------- 

おすすめ

転載: www.cnblogs.com/ly570/p/10954610.html