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接字串;計算關於元素的摘要資訊,如和、最小值、最大值或平均;計算「樞紐分析表」摘要,如「賣方最高交易價值」等。此類別 Collectors 提供了許多常見可變約簡的實作。
A Collector 由四個函數指定,這些函數協同工作,將條目累積到可變的結果容器中,並可選擇性地對結果進行最終轉換。 它們分別是:<ul><li>建立新的結果容器 (#supplier())</li><li>將新資料元素整合到結果容器 (#accumulator())</li><li>將兩個結果容器合併為一個 (#combiner())</li><li>對容器執行可選的最終轉換 (#finisher())</li></ul>
收集器還有一組特性,例如 Characteristics#CONCURRENT,提供可被約簡實作利用的提示,以提升效能。
使用收集器進行序列化的約簡實作,會利用供應商函式建立單一結果容器,並對每個輸入元素呼叫一次累加器函式。 平行實作會將輸入分割,為每個分割建立結果容器,將每個分割區的內容累積成該分割區的子結果,然後使用合併函式將子結果合併成合併結果。
為確保序列與平行執行產生等價結果,收集函數必須滿足 <em 恆等>式/em< 與>結合性約束。
恆等限制說明,對於任何部分累積的結果,與空結果容器結合必須得到等價的結果。 也就是說,對於部分累積結果 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 收集子,兩個累積結果 a1 和 a2 等價於 finisher.apply(a1).equals(finisher.apply(a2))。 對於無序收集子,等價性會被放寬,以允許因順序差異而產生的非相等。 (例如,一個無序的收集器若累積元素到 , List 若兩個列表包含相同元素,則視其為等價,且忽略順序。)
基於 的函 Collector式庫(如 Stream#collect(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.util.stream.CollectorJava 檔。
此頁面的部分是根據 Android 開放原始碼專案所建立和共用的工作進行修改,並根據 Creative Commons 2.5 屬性授權中所述的詞彙使用。
屬性
| 名稱 | Description |
|---|---|
| Handle |
取得底層 Android 物件的 JNI 值。 (繼承來源 IJavaObject) |
| JniIdentityHashCode |
回傳包裹實例的 |
| JniManagedPeerState |
管理貴族的狀況。 (繼承來源 IJavaPeerable) |
| JniObjectReferenceControlBlock |
一種可變的約簡操作,將輸入元素累積到可變結果容器中,並在處理完所有輸入元素後,選擇性地將累積結果轉換為最終表示。 (繼承來源 IJavaPeerable) |
| JniPeerMembers |
成員存取與召喚支援。 (繼承來源 IJavaPeerable) |
| PeerReference |
回傳JniObjectReference包裹後的 Java 物件實例。 (繼承來源 IJavaPeerable) |
方法
| 名稱 | Description |
|---|---|
| Accumulator() |
一個將值折疊到可變結果容器中的函數。 |
| Characteristics() |
回報 A |
| Combiner() |
一個接受兩個部分結果並將其合併的函數。 |
| 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) |
擴充方法
| 名稱 | Description |
|---|---|
| GetJniTypeName(IJavaPeerable) |
取得實例 |
| JavaAs<TResult>(IJavaPeerable) |
試著強制 |
| JavaCast<TResult>(IJavaObject) |
執行 Android 執行時檢查型別轉換。 |
| JavaCast<TResult>(IJavaObject) |
一種可變的約簡操作,將輸入元素累積到可變結果容器中,並在處理完所有輸入元素後,選擇性地將累積結果轉換為最終表示。 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
試著強制 |