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()
)</li li><>を作成し、新しいデータ要素を結果コンテナー (#accumulator()
)</li>><に組み込み、2 つの結果コンテナーを 1 つの (#combiner()
)</li><に>結合し、コンテナー (#finisher()
)</li></ul でオプションの最終変換を実行します>
コレクターには、 などの Characteristics#CONCURRENT
一連の特性もあり、パフォーマンスを向上させるために削減実装で使用できるヒントを提供します。
コレクターを使用した削減の順次実装では、サプライヤー関数を使用して 1 つの結果コンテナーを作成し、入力要素ごとにアキュムレータ関数を 1 回呼び出します。 並列実装では、入力をパーティション分割し、各パーティションの結果コンテナーを作成し、各パーティションの内容をそのパーティションのサブ結果に蓄積した後、combiner 関数を使用してサブ結果を結合された結果にマージします。
順次実行と並列実行で同等の結果が得られるようにするには、コレクター関数が 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))
は等価です。 順序付けられていないコレクターの場合、等価性は緩和され、順序の違いに関連する非等値が可能になります。 (たとえば、 に要素を累積した順序なしのコレクターでは、順序を無視して List
同じ要素が含まれている場合、2 つのリストが同等であると見なされます)。
などの Stream#collect(Collector)
に基づいてCollector
削減を実装するライブラリは、次の制約に従う必要があります。<ul<>li>アキュムレータ関数に渡される最初の引数、コンバイナー関数に渡される両方の引数、および finisher 関数に渡される引数は、結果サプライヤー、アキュムレータ、またはコンバイナー関数の以前の呼び出しの結果である必要があります。</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
。
このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。
プロパティ
Handle |
基になる Android オブジェクトの JNI 値を取得します。 (継承元 IJavaObject) |
JniIdentityHashCode |
ラップされたインスタンスの の |
JniManagedPeerState |
マネージド ピアの状態。 (継承元 IJavaPeerable) |
JniPeerMembers |
メンバー アクセスと呼び出しのサポート。 (継承元 IJavaPeerable) |
PeerReference |
JniObjectReferenceラップされた Java オブジェクト インスタンスの を返します。 (継承元 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) |
入力要素を変更可能な結果コンテナーに蓄積し、必要に応じて、すべての入力要素が処理された後に累積された結果を最終的な表現に変換する変更可能な削減操作。 |