ICollector インターフェイス

定義

入力要素を変更可能な結果コンテナーに蓄積し、必要に応じて、すべての入力要素が処理された後に累積された結果を最終的な表現に変換する変更可能な縮小操作。

[Android.Runtime.Register("java/util/stream/Collector", "", "Java.Util.Streams.ICollectorInvoker", ApiSince=24)]
[Java.Interop.JavaTypeParameters(new System.String[] { "T", "A", "R" })]
public interface ICollector : Android.Runtime.IJavaObject, IDisposable, Java.Interop.IJavaPeerable
[<Android.Runtime.Register("java/util/stream/Collector", "", "Java.Util.Streams.ICollectorInvoker", ApiSince=24)>]
[<Java.Interop.JavaTypeParameters(new System.String[] { "T", "A", "R" })>]
type ICollector = interface
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
属性
実装

注釈

入力要素を変更可能な結果コンテナーに蓄積し、必要に応じて、すべての入力要素が処理された後に累積された結果を最終的な表現に変換する変更可能な縮小操作。 削減操作は、順番に、または並列で実行できます。

変更可能な削減操作の例としては、要素を Collectionに蓄積する、 StringBuilderを使用して文字列を連結する、sum、min、max、average などの要素に関する概要情報を計算する、"販売者による最大値トランザクション" などの "ピボット テーブル" の概要を計算するなどがあります。 Collectors クラスは、多くの一般的な変更可能な削減の実装を提供します。

Collectorは、変更可能な結果コンテナーにエントリを蓄積し、必要に応じて結果に対して最終的な変換を実行する 4 つの関数によって指定されます。 これらは、新しい結果コンテナー (#supplier()) の<ul><li>作成</li><li>新しいデータ要素を結果コンテナー (#accumulator())</li に組み込みます。 ><li> 2 つの結果コンテナーを 1 つの (#combiner())</li><li>コンテナー (#finisher())</li></ul のオプションの最終変換を実行します。>

コレクターには、パフォーマンスを向上させるために削減実装で使用できるヒントを提供する一連の特性 ( Characteristics#CONCURRENTなど) もあります。

コレクターを使用して削減を順次実装すると、サプライヤー関数を使用して 1 つの結果コンテナーが作成され、入力要素ごとにアキュムレータ関数が 1 回呼び出されます。 並列実装では、入力をパーティション分割し、各パーティションの結果コンテナーを作成し、各パーティションの内容をそのパーティションのサブインスタンスに蓄積した後、コンバイナー関数を使用してサブ結果を結合結果にマージします。

順次実行と並列実行で同等の結果が得られるようにするには、コレクター関数が <em>identity</em> および結合制約を満たす必要があります。

ID 制約は、部分的に累積された結果の場合、それを空の結果コンテナーと組み合わせて同等の結果を生成する必要があることを示しています。 つまり、アキュムレータ呼び出しとコンバイナー呼び出しの結果である部分的に累積された結果 a の場合、 acombiner.apply(a, supplier.get())と同等である必要があります。

結合性制約では、計算を分割すると同等の結果が生成される必要があります。 つまり、入力要素 t1 および t2の場合、次の計算の結果 r1r2 は同等である必要があります。

{@code
                A a1 = supplier.get();
                accumulator.accept(a1, t1);
                accumulator.accept(a1, t2);
                R r1 = finisher.apply(a1);  // result without splitting

                A a2 = supplier.get();
                accumulator.accept(a2, t1);
                A a3 = supplier.get();
                accumulator.accept(a3, t2);
                R r2 = finisher.apply(combiner.apply(a2, a3));  // result with splitting
            } 

UNORDERED特性を持たないコレクターの場合、2 つの累積結果がa1され、a2finisher.apply(a1).equals(finisher.apply(a2))場合は等しくなります。 順序付けされていないコレクターの場合、等価性は緩和され、順序の違いに関連する非等値が可能になります。 (たとえば、要素を List に累積した順序付けされていないコレクターでは、順序を無視して同じ要素が含まれている場合、2 つのリストが同等であると見なされます)。

Stream#collect(Collector)など、Collectorに基づく削減を実装するライブラリは、次の制約に従う必要があります。<ul><li>アキュムレータ関数に渡される最初の引数は、コンバイナー関数に渡される引数と、完了関数に渡される引数の両方が、結果のサプライヤー、アキュムレータ、またはコンバイナー関数の以前の呼び出しの結果である必要があります</li><li>実装は、アキュムレータ関数、コンバイナー関数、または完了関数に再度渡す、または削減操作の呼び出し元に返す以外に、結果のサプライヤー、アキュムレータ、コンバイナー関数の結果に対して何もしないでください。</li><li>コンバイナーまたはフィニッサー関数に結果が渡され、その関数から同じオブジェクトが返されない場合は、再度使用されることはありません</li><li>結果がコンバイナーまたはフィニッシャー関数に渡されると、アキュムレータ関数に再び渡されることはありません。</li><li>非同時実行コレクターの場合、結果サプライヤー、アキュムレータ、またはコンバイナー関数から返される結果は、順次スレッド制限されている必要があります。 これにより、追加の同期を実装する必要 Collector なく、コレクションを並列で実行できます。 削減の実装では、入力が適切にパーティション分割されていること、パーティションが分離して処理されていること、および結合が行われるのは、累積が完了した後にのみ行われる必要があります</li><li>同時実行コレクターの場合、実装は、同時に削減を実装する (ただし、必要ありません)。 コンカレントリダクションは、アキュムレータ関数が複数のスレッドから同時に呼び出され、蓄積中に結果を分離するのではなく、同じ同時に変更可能な結果コンテナーを使用することです。 同時削減は、コレクターに Characteristics#UNORDERED 特性がある場合、または元のデータが順序付けされていない場合にのみ適用する必要があります</li></ul>

Collectorsの定義済みの実装に加えて、静的ファクトリ メソッド#of(Supplier, BiConsumer, BinaryOperator, Characteristics...)使用してコレクターを構築できます。 たとえば、次を使用してウィジェットを TreeSet に蓄積するコレクターを作成できます。

{@code
                Collector<Widget, ?, TreeSet<Widget>> intoSet =
                    Collector.of(TreeSet::new, TreeSet::add,
                                 (left, right) -> { left.addAll(right); return left; });
            }

(この動作は、定義済みのコレクター Collectors#toCollection(Supplier)によっても実装されます)。

1.8 で追加されました。

Javaドキュメント。

このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。

プロパティ

名前 説明
Handle

基になる Android オブジェクトの JNI 値を取得します。

(継承元 IJavaObject)
JniIdentityHashCode

ラップされたインスタンスの java.lang.System.identityHashCode() の値を返します。

(継承元 IJavaPeerable)
JniManagedPeerState

マネージド ピアの状態。

(継承元 IJavaPeerable)
JniPeerMembers

メンバー アクセスと呼び出しのサポート。

(継承元 IJavaPeerable)
PeerReference

ラップされたJava オブジェクト インスタンスのJniObjectReferenceを返します。

(継承元 IJavaPeerable)

メソッド

名前 説明
Accumulator()

変更可能な結果コンテナーに値を折りたたむ関数。

Characteristics()

このコレクターの特性を示すCollector.CharacteristicsSetを返します。

Combiner()

2 つの部分的な結果を受け取り、それらをマージする関数。

Disposed()

インスタンスが破棄されたときに呼び出されます。

(継承元 IJavaPeerable)
DisposeUnlessReferenced()

このインスタンスへの未処理の参照がない場合は、 Dispose()を呼び出します。それ以外の場合は何も実行しません。

(継承元 IJavaPeerable)
Finalized()

インスタンスが終了したときに呼び出されます。

(継承元 IJavaPeerable)
Finisher()

中間累積タイプ A から最終結果タイプ Rへの最終変換を実行します。

Of(ISupplier, IBiConsumer, IBinaryOperator, CollectorCharacteristics[])

指定したsupplieraccumulatorcombiner、およびfinisher関数によって記述された新しいCollectorを返します。

Of(ISupplier, IBiConsumer, IBinaryOperator, IFunction, CollectorCharacteristics[])

指定したsupplieraccumulatorcombiner、およびfinisher関数によって記述された新しいCollectorを返します。

SetJniIdentityHashCode(Int32)

JniIdentityHashCodeによって返される値を設定します。

(継承元 IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates)

入力要素を変更可能な結果コンテナーに蓄積し、必要に応じて、すべての入力要素が処理された後に累積された結果を最終的な表現に変換する変更可能な縮小操作。

(継承元 IJavaPeerable)
SetPeerReference(JniObjectReference)

PeerReferenceによって返される値を設定します。

(継承元 IJavaPeerable)
Supplier()

変更可能な新しい結果コンテナーを作成して返す関数。

UnregisterFromRuntime()

ランタイムが将来の Java.Interop.JniRuntime+JniValueManager.PeekValue 呼び出しから返されないように、このインスタンスの登録を解除します。

(継承元 IJavaPeerable)

拡張メソッド

名前 説明
GetJniTypeName(IJavaPeerable)

インスタンス selfの型の JNI 名を取得します。

JavaAs<TResult>(IJavaPeerable)

selfを強制的にTResult入力し、強制型がJava側で有効であることを確認します。

JavaCast<TResult>(IJavaObject)

Android ランタイムチェック型変換を実行します。

JavaCast<TResult>(IJavaObject)

入力要素を変更可能な結果コンテナーに蓄積し、必要に応じて、すべての入力要素が処理された後に累積された結果を最終的な表現に変換する変更可能な縮小操作。

TryJavaCast<TResult>(IJavaPeerable, TResult)

selfを強制的にTResult入力し、強制型がJava側で有効であることを確認します。

適用対象