語言

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
屬性
實作

備註

一種可變的約簡操作,將輸入元素累積到可變結果容器中,並在處理完所有輸入元素後,選擇性地將累積結果轉換為最終表示。 約簡操作可以依序或並行執行。

可變約簡操作的例子包括:將元素累積為 ; 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())

結合性約束指出,分割計算必須得到等價的結果。 也就是說,對於任意輸入元素 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 收集子,兩個累積結果 a1a2 等價於 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

回傳包裹實例的 java.lang.System.identityHashCode() 值。

(繼承來源 IJavaPeerable)
JniManagedPeerState

管理貴族的狀況。

(繼承來源 IJavaPeerable)
JniObjectReferenceControlBlock

一種可變的約簡操作,將輸入元素累積到可變結果容器中,並在處理完所有輸入元素後,選擇性地將累積結果轉換為最終表示。

(繼承來源 IJavaPeerable)
JniPeerMembers

成員存取與召喚支援。

(繼承來源 IJavaPeerable)
PeerReference

回傳JniObjectReference包裹後的 Java 物件實例。

(繼承來源 IJavaPeerable)

方法

名稱 Description
Accumulator()

一個將值折疊到可變結果容器中的函數。

Characteristics()

回報 A SetCollector.Characteristics ,顯示此收藏器的特性。

Combiner()

一個接受兩個部分結果並將其合併的函數。

Disposed()

當實例被處理後才被召喚。

(繼承來源 IJavaPeerable)
DisposeUnlessReferenced()

如果沒有未解決的參考資料,則 Dispose()呼叫;否則,則不做任何事。

(繼承來源 IJavaPeerable)
Finalized()

當實例完成後才會被通知。

(繼承來源 IJavaPeerable)
Finisher()

將中間累積類型 A 對最終結果類型 R進行最終轉換。

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

回傳由給定Collector的 、 supplieraccumulatorcombiner 函數所描述的新 finisher

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

回傳由給定Collector的 、 supplieraccumulatorcombiner 函數所描述的新 finisher

SetJniIdentityHashCode(Int32)

將回傳的值設為 JniIdentityHashCode

(繼承來源 IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates)

一種可變的約簡操作,將輸入元素累積到可變結果容器中,並在處理完所有輸入元素後,選擇性地將累積結果轉換為最終表示。

(繼承來源 IJavaPeerable)
SetPeerReference(JniObjectReference)

將回傳的值設為 PeerReference

(繼承來源 IJavaPeerable)
Supplier()

一個建立並回傳新的可變結果容器的函式。

UnregisterFromRuntime()

取消註冊此實例,讓執行時不會在未來 Java.Interop.JniRuntime+JniValueManager.PeekValue 的呼叫中回傳該實例。

(繼承來源 IJavaPeerable)

擴充方法

名稱 Description
GetJniTypeName(IJavaPeerable)

取得實例 self類型的 JNI 名稱。

JavaAs<TResult>(IJavaPeerable)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

JavaCast<TResult>(IJavaObject)

執行 Android 執行時檢查型別轉換。

JavaCast<TResult>(IJavaObject)

一種可變的約簡操作,將輸入元素累積到可變結果容器中,並在處理完所有輸入元素後,選擇性地將累積結果轉換為最終表示。

TryJavaCast<TResult>(IJavaPeerable, TResult)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

適用於