ICollector Interfaccia
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Operazione di riduzione modificabile che accumula gli elementi di input in un contenitore di risultati modificabile, trasformando facoltativamente il risultato accumulato in una rappresentazione finale dopo l'elaborazione di tutti gli elementi di input.
[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
- Attributi
- Implementazioni
Commenti
Operazione di riduzione modificabile che accumula gli elementi di input in un contenitore di risultati modificabile, trasformando facoltativamente il risultato accumulato in una rappresentazione finale dopo l'elaborazione di tutti gli elementi di input. Le operazioni di riduzione possono essere eseguite in sequenza o in parallelo.
Esempi di operazioni di riduzione modificabili includono: accumulo di elementi in un Collection
oggetto , concatenazione di stringhe con un StringBuilder
; calcolo di informazioni di riepilogo sugli elementi, ad esempio somma, min, max o media; calcolo di riepiloghi "tabella pivot", ad esempio "transazione massima valutata dal venditore" e così via. La classe Collectors
fornisce implementazioni di molte riduzioni modificabili comuni.
Un Collector
oggetto viene specificato da quattro funzioni che interagiscono per accumulare voci in un contenitore di risultati modificabile e, facoltativamente, eseguire una trasformazione finale sul risultato. Sono: <ul<>li>creation of a new result container (#supplier()
)</li<>>incorporare un nuovo elemento dati in un contenitore di risultati (#accumulator()
)</li>><combinando due contenitori di risultati in uno (#combiner()
)</li><li>eseguendo una trasformazione finale facoltativa nel contenitore (#finisher()
)</li></ul>
Gli agenti di raccolta hanno anche un set di caratteristiche, ad esempio Characteristics#CONCURRENT
, che forniscono hint che possono essere usati da un'implementazione di riduzione per offrire prestazioni migliori.
Un'implementazione sequenziale di una riduzione tramite un agente di raccolta crea un singolo contenitore di risultati usando la funzione supplier e richiama la funzione dell'elemento una volta per ogni elemento di input. Un'implementazione parallela partiziona l'input, crea un contenitore di risultati per ogni partizione, accumula il contenuto di ogni partizione in un sottoresult per tale partizione e quindi usa la funzione combinatore per unire i subresult in un risultato combinato.
Per garantire che le esecuzioni sequenziali e parallele producano risultati equivalenti, le funzioni dell'agente di raccolta devono soddisfare vincoli <di identità</>em> e associatività.
Il vincolo Identity indica che per qualsiasi risultato parzialmente accumulato, combinarlo con un contenitore di risultati vuoto deve produrre un risultato equivalente. Ciò significa che per un risultato a
parzialmente accumulato che è il risultato di qualsiasi serie di chiamate dell'riduttore e del combinatore, a
deve essere equivalente a combiner.apply(a, supplier.get())
.
Il vincolo di associatività indica che la divisione del calcolo deve produrre un risultato equivalente. Ciò significa che per tutti gli elementi t1
di input e t2
, i risultati r1
e r2
nel calcolo seguente devono essere equivalenti:
{@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
}
Per gli agenti di raccolta che non hanno la UNORDERED
caratteristica , due risultati a1
accumulati e a2
sono equivalenti se finisher.apply(a1).equals(finisher.apply(a2))
. Per gli agenti di raccolta non ordinati, l'equivalenza è rilassata per consentire la mancata uguaglianza correlata alle differenze in ordine. Ad esempio, un agente di raccolta non ordinato che accumulava elementi in un List
oggetto considererebbe due elenchi equivalenti se contengono gli stessi elementi, ignorando l'ordine.
Le librerie che implementano la riduzione in Collector
base a , ad esempio Stream#collect(Collector)
, devono rispettare i vincoli seguenti: <ul><li>Il primo argomento passato alla funzione dell'indicizzatore, entrambi gli argomenti passati alla funzione combinatore e l'argomento passato alla funzione finisher deve essere il risultato di una precedente chiamata del fornitore dei risultati, dell'utilità di combinazione o dell'utilità di combinazione.</li><li>L'implementazione non deve eseguire alcuna operazione con il risultato di nessuna delle funzioni del fornitore di risultati, dell'indicizzatore o del combinatore diverso da passare di nuovo alle funzioni dell'utilità di combinazione, del combinatore o del finisher, oppure di restituirle al chiamante dell'operazione di riduzione.</li><Se>un risultato viene passato alla funzione combiner o finisher e lo stesso oggetto non viene restituito da tale funzione, non viene mai usato di nuovo.</li><li>Una volta passato un risultato alla funzione combiner o finisher, non viene mai passato di nuovo alla funzione dell'indicizzatore.</li><li>Per gli agenti di raccolta non simultanei, qualsiasi risultato restituito dal fornitore del risultato, dall'indicizzatore o dalle funzioni di combinatore deve essere limitato a thread serialmente. In questo modo la raccolta viene eseguita in parallelo senza dover Collector
implementare alcuna sincronizzazione aggiuntiva. L'implementazione della riduzione deve gestire che l'input sia partizionato correttamente, che le partizioni vengano elaborate in isolamento e che la combinazione avvenga solo dopo il completamento dell'accumulo.</li><li>Per gli agenti di raccolta simultanei, un'implementazione è gratuita (ma non necessaria) implementare simultaneamente la riduzione. Una riduzione simultanea è uno dei casi in cui la funzione dell'riduttore viene chiamata simultaneamente da più thread, usando lo stesso contenitore di risultati modificabile contemporaneamente, anziché mantenere il risultato isolato durante l'accumulo. È consigliabile applicare una riduzione simultanea solo se l'agente di raccolta ha le Characteristics#UNORDERED
caratteristiche o se i dati di origine non sono ordinati.</li></ul>
Oltre alle implementazioni predefinite in Collectors
, i metodi #of(Supplier, BiConsumer, BinaryOperator, Characteristics...)
factory statici possono essere usati per costruire agenti di raccolta. Ad esempio, è possibile creare un agente di raccolta che accumula widget in un TreeSet
con:
{@code
Collector<Widget, ?, TreeSet<Widget>> intoSet =
Collector.of(TreeSet::new, TreeSet::add,
(left, right) -> { left.addAll(right); return left; });
}
Questo comportamento viene implementato anche dall'agente di raccolta Collectors#toCollection(Supplier)
predefinito .
Aggiunta nella versione 1.8.
Documentazione java per java.util.stream.Collector
.
Le parti di questa pagina sono modifiche basate sul lavoro creato e condiviso dal progetto Open Source Android e usato in base ai termini descritti nella licenza Creative Commons 2.5 Attribuzione.
Proprietà
Handle |
Ottiene il valore JNI dell'oggetto Android sottostante. (Ereditato da IJavaObject) |
JniIdentityHashCode |
Restituisce il valore di |
JniManagedPeerState |
Stato del peer gestito. (Ereditato da IJavaPeerable) |
JniPeerMembers |
Supporto per l'accesso ai membri e la chiamata. (Ereditato da IJavaPeerable) |
PeerReference |
Restituisce un JniObjectReference oggetto dell'istanza dell'oggetto Java di cui è stato eseguito il wrapping. (Ereditato da IJavaPeerable) |
Metodi
Accumulator() |
Funzione che riduce un valore in un contenitore di risultati modificabile. |
Characteristics() |
Restituisce un valore |
Combiner() |
Funzione che accetta due risultati parziali e li unisce. |
Disposed() |
Chiamato quando l'istanza è stata eliminata. (Ereditato da IJavaPeerable) |
DisposeUnlessReferenced() |
Se non sono presenti riferimenti in sospeso a questa istanza, chiama |
Finalized() |
Chiamato quando l'istanza è stata finalizzata. (Ereditato da IJavaPeerable) |
Finisher() |
Eseguire la trasformazione finale dal tipo |
Of(ISupplier, IBiConsumer, IBinaryOperator, CollectorCharacteristics[]) |
Restituisce un nuovo |
Of(ISupplier, IBiConsumer, IBinaryOperator, IFunction, CollectorCharacteristics[]) |
Restituisce un nuovo |
SetJniIdentityHashCode(Int32) |
Impostare il valore restituito da |
SetJniManagedPeerState(JniManagedPeerStates) |
Operazione di riduzione modificabile che accumula gli elementi di input in un contenitore di risultati modificabile, trasformando facoltativamente il risultato accumulato in una rappresentazione finale dopo l'elaborazione di tutti gli elementi di input. (Ereditato da IJavaPeerable) |
SetPeerReference(JniObjectReference) |
Impostare il valore restituito da |
Supplier() |
Funzione che crea e restituisce un nuovo contenitore di risultati modificabile. |
UnregisterFromRuntime() |
Annullare la registrazione di questa istanza in modo che il runtime non lo restituisca dalle chiamate future Java.Interop.JniRuntime+JniValueManager.PeekValue . (Ereditato da IJavaPeerable) |
Metodi di estensione
JavaCast<TResult>(IJavaObject) |
Esegue una conversione del tipo di tipo controllato dal runtime Android. |
JavaCast<TResult>(IJavaObject) |
Operazione di riduzione modificabile che accumula gli elementi di input in un contenitore di risultati modificabile, trasformando facoltativamente il risultato accumulato in una rappresentazione finale dopo l'elaborazione di tutti gli elementi di input. |
GetJniTypeName(IJavaPeerable) |
Operazione di riduzione modificabile che accumula gli elementi di input in un contenitore di risultati modificabile, trasformando facoltativamente il risultato accumulato in una rappresentazione finale dopo l'elaborazione di tutti gli elementi di input. |