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: accumulare elementi in una ; concatenando stringhe usando un Collection
StringBuilder
; calcolo delle informazioni di riepilogo sugli elementi, ad esempio somma, min, max o media; calcolo dei riepiloghi "tabella pivot", ad esempio "transazione massima valutata dal venditore", ecc. La classe Collectors
fornisce implementazioni di molte riduzioni mutable 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>creazione di un nuovo contenitore di risultati ()/li><>che incorpora un nuovo elemento dati in un contenitore di risultati (<#accumulator()
)/li combinando due contenitori di risultati in uno#combiner()
()><<<>/><>li che esegue una trasformazione finale facoltativa nel contenitore#finisher()
(#supplier()
)</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 usando un agente di raccolta creerebbe un singolo contenitore di risultati usando la funzione fornitore e richiama la funzione accumulatore 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 le sottoresulte in un risultato combinato.
Per garantire che le esecuzioni sequenziali e parallele producano risultati equivalenti, le funzioni dell'agente di raccolta devono soddisfare un'identità <<em/em>> e vincoli di associatività.
Il vincolo identity indica che per qualsiasi risultato parzialmente accumulato, combinarlo con un contenitore di risultati vuoto deve produrre un risultato equivalente. Vale a dire, per un risultato a
parzialmente accumulato che è il risultato di qualsiasi serie di chiamate di accumulatori e combinatore, a
deve essere equivalente a combiner.apply(a, supplier.get())
.
Il vincolo associativo indica che la suddivisione del calcolo deve produrre un risultato equivalente. Vale a dire, per tutti gli elementi t1
di input e , i risultati r1
e t2
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 l'uguaglianza correlata alle differenze in ordine. Ad esempio, un agente di raccolta non ordinato che accumulava elementi in un List
valore considererebbe due elenchi equivalenti se contengono gli stessi elementi, ignorando l'ordine.
Le librerie che implementano la riduzione in base Collector
a , ad esempio Stream#collect(Collector)
, devono rispettare i vincoli seguenti: <ul><li>Il primo argomento passato alla funzione accumulatore, entrambi gli argomenti passati alla funzione combinatore e l'argomento passato alla funzione di completamento deve essere il risultato di una chiamata precedente del fornitore di risultati, dell'accumulatore o delle funzioni combinate.</li><>L'implementazione non deve fare nulla con il risultato di uno dei fornitori di risultati, dell'accumulatore o delle funzioni combinatore diverso da passare di nuovo alle funzioni di accumulatore, combinatore o finetore o 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 che un risultato viene passato alla funzione combinatrice o fine, non viene mai passata alla funzione accumulatore.</li><li>Per gli agenti di raccolta non simultanei, tutti i risultati restituiti dal fornitore del risultato, dall'accumulatore o dalle funzioni combinatori devono essere vincolati in serie. Ciò consente alla raccolta di verificarsi in parallelo senza la Collector
necessità di 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 si verifichi solo dopo il completamento dell'accumulo.</li><Li>Per gli agenti di raccolta simultanei, un'implementazione è gratuita (ma non necessaria) implementare la riduzione simultaneamente. Una riduzione simultanea è una posizione in cui la funzione accumulatore viene chiamata simultaneamente da più thread, usando lo stesso contenitore di risultati modificabile simultaneamente, anziché mantenere isolato il risultato durante l'accumulo. Una riduzione simultanea deve essere applicata 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
, è possibile usare i metodi #of(Supplier, BiConsumer, BinaryOperator, Characteristics...)
di factory statici per costruire gli 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 in base al lavoro creato e condiviso dal Android Open Source e usato in base ai termini descritti nella .
Proprietà
Handle |
Ottiene il valore JNI dell'oggetto Android sottostante. (Ereditato da IJavaObject) |
JniIdentityHashCode |
Restituisce il valore di per |
JniManagedPeerState |
Stato del peer gestito. (Ereditato da IJavaPeerable) |
JniPeerMembers |
Supporto per l'accesso ai membri e la chiamata. (Ereditato da IJavaPeerable) |
PeerReference |
Restituisce un'istanza JniObjectReference dell'oggetto Java con wrapping. (Ereditato da IJavaPeerable) |
Metodi
Accumulator() |
Funzione che piega un valore in un contenitore risultato modificabile. |
Characteristics() |
Restituisce un |
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 restituirà dalle chiamate future Java.Interop.JniRuntime+JniValueManager.PeekValue . (Ereditato da IJavaPeerable) |
Metodi di estensione
JavaCast<TResult>(IJavaObject) |
Esegue una conversione dei tipi controllati 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. |