次の方法で共有


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
属性
実装

注釈

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

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

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

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

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

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

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

結合性制約では、計算を分割すると同等の結果が生成される必要があります。 つまり、すべての入力要素 t1t2、以下の計算の結果 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 つの蓄積された結果 a1a2 等しい場合 finisher.apply(a1).equals(finisher.apply(a2))に等しくなります。 順序付けされていないコレクターの場合、等価性は緩和され、順序の違いに関連する非等値が可能になります。 (たとえば、要素を a 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 ドキュメントjava.util.stream.Collector

このページの一部は、Android オープンソース プロジェクトによって作成および共有され、クリエイティブ コモンズ 2.5 属性ライセンスに記載されている条件に従って使用される作業に基づく変更です。

プロパティ

Handle

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

(継承元 IJavaObject)
JniIdentityHashCode

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

(継承元 IJavaPeerable)
JniManagedPeerState

マネージド ピアの状態。

(継承元 IJavaPeerable)
JniPeerMembers

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

(継承元 IJavaPeerable)
PeerReference

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

(継承元 IJavaPeerable)

メソッド

Accumulator()

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

Characteristics()

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

Combiner()

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

Disposed()

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

(継承元 IJavaPeerable)
DisposeUnlessReferenced()

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

(継承元 IJavaPeerable)
Finalized()

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

(継承元 IJavaPeerable)
Finisher()

中間累積型から最終的な結果型 A への最終的な変換を実行します R

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

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

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

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

SetJniIdentityHashCode(Int32)

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

(継承元 IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates)

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

(継承元 IJavaPeerable)
SetPeerReference(JniObjectReference)

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

(継承元 IJavaPeerable)
Supplier()

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

UnregisterFromRuntime()

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

(継承元 IJavaPeerable)

拡張メソッド

JavaCast<TResult>(IJavaObject)

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

JavaCast<TResult>(IJavaObject)

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

GetJniTypeName(IJavaPeerable)

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

適用対象