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
提供許多常見可變動縮減的實作。
Collector
是由四個函式所指定,這些函式會一起將項目累積到可變的結果容器中,並選擇性地對結果執行最終轉換。 它們是:<ul><li>建立新的結果容器 (#supplier()
)/li li<>>將新的數據元素併入結果容器 (#accumulator()
)<</li>><li 將兩個結果容器結合成一個#combiner()
()</li>><li 執行容器的選擇性最終轉換 (#finisher()
)</li></ul>
收集器也有一組特性,例如 Characteristics#CONCURRENT
,提供可供縮減實作使用的提示,以提供更佳的效能。
使用收集器進行縮減的循序實作會使用供應商函式建立單一結果容器,並針對每個輸入元素叫用累加器函式一次。 平行實作會分割輸入、為每個分割區建立結果容器、將每個分割區的內容累積到該數據分割的子數據分割中,然後使用結合器函式將子數據合併成合併的結果。
為了確保循序和平行執行會產生對等的結果,收集器函式必須滿足 <em>identity</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
,如果 finisher.apply(a1).equals(finisher.apply(a2))
為 ,則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.Collector
Java 檔。
此頁面的部分是根據 Android 開放原始碼專案所建立和共用的工作進行修改,並根據 Creative Commons 2.5 屬性授權中所述的詞彙使用。
屬性
Handle |
取得基礎 Android 物件的 JNI 值。 (繼承來源 IJavaObject) |
JniIdentityHashCode |
傳回包裝實例的 值 |
JniManagedPeerState |
受控對等的狀態。 (繼承來源 IJavaPeerable) |
JniPeerMembers |
成員存取和調用支援。 (繼承來源 IJavaPeerable) |
PeerReference |
傳 JniObjectReference 回已包裝 Java 物件實例的 。 (繼承來源 IJavaPeerable) |
方法
Accumulator() |
將值折疊成可變結果容器的函式。 |
Characteristics() |
傳 |
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) |
擴充方法
JavaCast<TResult>(IJavaObject) |
執行 Android 執行時間檢查的類型轉換。 |
JavaCast<TResult>(IJavaObject) |
可變動縮減作業,可將輸入元素累積到可變動的結果容器,並選擇性地將所有輸入元素處理之後,將累積的結果轉換成最終表示法。 |
GetJniTypeName(IJavaPeerable) |
可變動縮減作業,可將輸入元素累積到可變動的結果容器,並選擇性地將所有輸入元素處理之後,將累積的結果轉換成最終表示法。 |