ICollector インターフェイス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
入力要素を変更可能な結果コンテナーに蓄積し、必要に応じて、すべての入力要素が処理された後に累積された結果を最終的な表現に変換する変更可能な縮小操作。
[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())
必要があります。
結合性制約では、計算を分割すると同等の結果が生成される必要があります。 つまり、すべての入力要素 t1
と t2
、以下の計算の結果 r1
は r2
同等である必要があります。
{@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
が a2
等しい場合 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 |
ラップされたインスタンスの |
JniManagedPeerState |
マネージド ピアの状態。 (継承元 IJavaPeerable) |
JniPeerMembers |
メンバー アクセスと呼び出しのサポート。 (継承元 IJavaPeerable) |
PeerReference |
ラップされた Java オブジェクト インスタンスの a JniObjectReference を返します。 (継承元 IJavaPeerable) |
メソッド
Accumulator() |
変更可能な結果コンテナーに値を折りたたむ関数。 |
Characteristics() |
|
Combiner() |
2 つの部分的な結果を受け取り、それらをマージする関数。 |
Disposed() |
インスタンスが破棄されたときに呼び出されます。 (継承元 IJavaPeerable) |
DisposeUnlessReferenced() |
このインスタンスへの未処理の参照がない場合は、呼び出 |
Finalized() |
インスタンスが終了したときに呼び出されます。 (継承元 IJavaPeerable) |
Finisher() |
中間累積型から最終的な結果型 |
Of(ISupplier, IBiConsumer, IBinaryOperator, CollectorCharacteristics[]) |
指定 |
Of(ISupplier, IBiConsumer, IBinaryOperator, IFunction, CollectorCharacteristics[]) |
指定 |
SetJniIdentityHashCode(Int32) |
によって |
SetJniManagedPeerState(JniManagedPeerStates) |
入力要素を変更可能な結果コンテナーに蓄積し、必要に応じて、すべての入力要素が処理された後に累積された結果を最終的な表現に変換する変更可能な縮小操作。 (継承元 IJavaPeerable) |
SetPeerReference(JniObjectReference) |
によって |
Supplier() |
変更可能な新しい結果コンテナーを作成して返す関数。 |
UnregisterFromRuntime() |
ランタイムが将来 Java.Interop.JniRuntime+JniValueManager.PeekValue の呼び出しから返されないように、このインスタンスの登録を解除します。 (継承元 IJavaPeerable) |
拡張メソッド
JavaCast<TResult>(IJavaObject) |
Android ランタイムチェック型変換を実行します。 |
JavaCast<TResult>(IJavaObject) |
入力要素を変更可能な結果コンテナーに蓄積し、必要に応じて、すべての入力要素が処理された後に累積された結果を最終的な表現に変換する変更可能な縮小操作。 |
GetJniTypeName(IJavaPeerable) |
入力要素を変更可能な結果コンテナーに蓄積し、必要に応じて、すべての入力要素が処理された後に累積された結果を最終的な表現に変換する変更可能な縮小操作。 |