ICollector Interfaz
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Una operación de reducción mutable que acumula elementos de entrada en un contenedor de resultados mutable, lo que opcionalmente transforma el resultado acumulado en una representación final una vez procesados todos los elementos de entrada.
[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
- Atributos
- Implementaciones
Comentarios
Una operación de reducción mutable que acumula elementos de entrada en un contenedor de resultados mutable, lo que opcionalmente transforma el resultado acumulado en una representación final una vez procesados todos los elementos de entrada. Las operaciones de reducción se pueden realizar secuencialmente o en paralelo.
Entre los ejemplos de operaciones de reducción mutable se incluyen: acumular elementos en ; Collection
concatenar cadenas mediante un StringBuilder
; información de resumen informático sobre elementos como sum, min, max o average; calcular resúmenes de "tabla dinámica" como "transacción con valores máximos por vendedor", etc. La clase Collectors
proporciona implementaciones de muchas reducciones mutables comunes.
Una Collector
clase se especifica mediante cuatro funciones que funcionan conjuntamente para acumular entradas en un contenedor de resultados mutable y, opcionalmente, realizar una transformación final en el resultado. Son: <ul><li>creación de un nuevo contenedor de resultados (#supplier()
)</li>><que incorpora un nuevo elemento de datos en un contenedor de resultados (#accumulator()
)</li li><>que combina dos contenedores de resultados en un (#combiner()
)</li li><>realizando una transformación final opcional en el contenedor (#finisher()
)</li></ul>
Los recopiladores también tienen un conjunto de características, como Characteristics#CONCURRENT
, que proporcionan sugerencias que una implementación de reducción puede usar para proporcionar un mejor rendimiento.
Una implementación secuencial de una reducción mediante un recopilador crearía un único contenedor de resultados mediante la función de proveedor e invocaría la función de acumulador una vez para cada elemento de entrada. Una implementación paralela particionaría la entrada, crearía un contenedor de resultados para cada partición, acumularía el contenido de cada partición en un subresult para esa partición y, a continuación, usaría la función del combinador para combinar los subresults en un resultado combinado.
Para asegurarse de que las ejecuciones secuenciales y paralelas producen resultados equivalentes, las funciones del recopilador deben satisfacer una <identidad</>em> em y restricciones de asociatividad.
La restricción de identidad indica que para cualquier resultado acumulado parcialmente, combinarlo con un contenedor de resultados vacío debe generar un resultado equivalente. Es decir, para un resultado a
acumulado parcialmente que es el resultado de cualquier serie de invocaciones de acumulador y combinador, a
debe ser equivalente a combiner.apply(a, supplier.get())
.
La restricción de asociatividad dice que dividir el cálculo debe generar un resultado equivalente. Es decir, para los elementos t1
de entrada y t2
, los resultados r1
y r2
en el cálculo siguiente deben ser equivalentes:
{@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
}
Para los recopiladores que no tienen la UNORDERED
característica , dos resultados a1
acumulados y a2
son equivalentes si finisher.apply(a1).equals(finisher.apply(a2))
. Para los recopiladores no ordenados, la equivalencia se relaja para permitir la no igualdad relacionada con las diferencias en orden. (Por ejemplo, un recopilador desordenado que acumulaba elementos a un List
consideraría dos listas equivalentes si contenían los mismos elementos, ignorando el orden).
Las bibliotecas que implementan la reducción en Collector
función de , como Stream#collect(Collector)
, deben cumplir las siguientes restricciones: <ul><li>El primer argumento pasado a la función de acumulador, ambos argumentos pasados a la función del combinador y el argumento pasado a la función de finalizador debe ser el resultado de una invocación anterior del proveedor de resultados, el acumulador o las funciones del combinador.</li li><>La implementación no debe hacer nada con el resultado de ninguna de las funciones de proveedor, acumulador o combinador de resultados que no sean pasarlas de nuevo al acumulador, combinador o terminador, o devolverlas al autor de la llamada de la operación de reducción.</li li><>Si se pasa un resultado a la función de combinador o finalizador, y el mismo objeto no se devuelve de esa función, nunca se vuelve a usar.</li li><>Una vez que se pasa un resultado a la función de combinador o finalizador, nunca se vuelve a pasar a la función de acumulador.</li li><>Para los recopiladores no simultáneos, los resultados devueltos por el proveedor de resultados, el acumulador o las funciones del combinador deben estar confinados en serie. Esto permite que la recopilación se produzca en paralelo sin Collector
necesidad de implementar ninguna sincronización adicional. La implementación de reducción debe administrar que la entrada está correctamente particionada, que las particiones se procesan de forma aislada y la combinación solo se produce después de que se complete la acumulación.</li li><>Para recopiladores simultáneos, una implementación es libre a (pero no es necesario) implementar la reducción simultáneamente. Una reducción simultánea es una en la que se llama a la función de acumulador simultáneamente desde varios subprocesos, utilizando el mismo contenedor de resultados modificable simultáneamente, en lugar de mantener el resultado aislado durante la acumulación. Solo se debe aplicar una reducción simultánea si el recopilador tiene las Characteristics#UNORDERED
características o si los datos de origen no están ordenados.</li></ul>
Además de las implementaciones predefinidas en Collectors
, los métodos de fábrica estáticos #of(Supplier, BiConsumer, BinaryOperator, Characteristics...)
se pueden usar para construir recopiladores. Por ejemplo, podría crear un recopilador que acumula widgets en un TreeSet
con:
{@code
Collector<Widget, ?, TreeSet<Widget>> intoSet =
Collector.of(TreeSet::new, TreeSet::add,
(left, right) -> { left.addAll(right); return left; });
}
(Este comportamiento también lo implementa el recopilador Collectors#toCollection(Supplier)
predefinido).
Agregado en la versión 1.8.
Documentación de Java para java.util.stream.Collector
.
Las partes de esta página son modificaciones basadas en el trabajo creado y compartido por el proyecto de código abierto de Android y se usan según los términos descritos en la licencia de atribución de Creative Commons 2.5.
Propiedades
Handle |
Obtiene el valor JNI del objeto Android subyacente. (Heredado de IJavaObject) |
JniIdentityHashCode |
Devuelve el valor de |
JniManagedPeerState |
Estado del mismo nivel administrado. (Heredado de IJavaPeerable) |
JniPeerMembers |
Compatibilidad con la invocación y el acceso de miembros. (Heredado de IJavaPeerable) |
PeerReference |
Devuelve una JniObjectReference de la instancia de objeto Java ajustada. (Heredado de IJavaPeerable) |
Métodos
Accumulator() |
Función que plega un valor en un contenedor de resultados mutable. |
Characteristics() |
Devuelve un |
Combiner() |
Función que acepta dos resultados parciales y las combina. |
Disposed() |
Se llama cuando se ha eliminado la instancia. (Heredado de IJavaPeerable) |
DisposeUnlessReferenced() |
Si no hay referencias pendientes a esta instancia, llama a |
Finalized() |
Se llama cuando se ha finalizado la instancia. (Heredado de IJavaPeerable) |
Finisher() |
Realice la transformación final del tipo |
Of(ISupplier, IBiConsumer, IBinaryOperator, CollectorCharacteristics[]) |
Devuelve un nuevo |
Of(ISupplier, IBiConsumer, IBinaryOperator, IFunction, CollectorCharacteristics[]) |
Devuelve un nuevo |
SetJniIdentityHashCode(Int32) |
Establezca el valor devuelto por |
SetJniManagedPeerState(JniManagedPeerStates) |
Una operación de reducción mutable que acumula elementos de entrada en un contenedor de resultados mutable, lo que opcionalmente transforma el resultado acumulado en una representación final una vez procesados todos los elementos de entrada. (Heredado de IJavaPeerable) |
SetPeerReference(JniObjectReference) |
Establezca el valor devuelto por |
Supplier() |
Función que crea y devuelve un nuevo contenedor de resultados mutable. |
UnregisterFromRuntime() |
Anule el registro de esta instancia para que el entorno de ejecución no lo devuelva de invocaciones futuras Java.Interop.JniRuntime+JniValueManager.PeekValue . (Heredado de IJavaPeerable) |
Métodos de extensión
JavaCast<TResult>(IJavaObject) |
Realiza una conversión de tipos comprobados en tiempo de ejecución de Android. |
JavaCast<TResult>(IJavaObject) |
Una operación de reducción mutable que acumula elementos de entrada en un contenedor de resultados mutable, lo que opcionalmente transforma el resultado acumulado en una representación final una vez procesados todos los elementos de entrada. |
GetJniTypeName(IJavaPeerable) |
Una operación de reducción mutable que acumula elementos de entrada en un contenedor de resultados mutable, lo que opcionalmente transforma el resultado acumulado en una representación final una vez procesados todos los elementos de entrada. |