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
- 属性
- 実装
注釈
入力要素を変更可能な結果コンテナーに蓄積し、必要に応じて、すべての入力要素が処理された後に累積された結果を最終的な表現に変換する変更可能な縮小操作。 削減操作は、順番に、または並列で実行できます。
変更可能な削減操作の例としては、要素を 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 の場合、 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))場合は等しくなります。 順序付けされていないコレクターの場合、等価性は緩和され、順序の違いに関連する非等値が可能になります。 (たとえば、要素を 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 で追加されました。
このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。
プロパティ
| 名前 | 説明 |
|---|---|
| Handle |
基になる Android オブジェクトの JNI 値を取得します。 (継承元 IJavaObject) |
| JniIdentityHashCode |
ラップされたインスタンスの |
| JniManagedPeerState |
マネージド ピアの状態。 (継承元 IJavaPeerable) |
| JniPeerMembers |
メンバー アクセスと呼び出しのサポート。 (継承元 IJavaPeerable) |
| PeerReference |
ラップされたJava オブジェクト インスタンスの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) |
拡張メソッド
| 名前 | 説明 |
|---|---|
| GetJniTypeName(IJavaPeerable) |
インスタンス |
| JavaAs<TResult>(IJavaPeerable) |
|
| JavaCast<TResult>(IJavaObject) |
Android ランタイムチェック型変換を実行します。 |
| JavaCast<TResult>(IJavaObject) |
入力要素を変更可能な結果コンテナーに蓄積し、必要に応じて、すべての入力要素が処理された後に累積された結果を最終的な表現に変換する変更可能な縮小操作。 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
|