Teeing, una joya escondida en la API de Java

La semana pasada, describí un caso de uso para una transmisión personalizada Collector. Recibí un comentario intrigante en Twitter:

¡Me quito el sombrero ante ti, Miguel! ¡Tu comentario reveló un método que no conocía!

Así que decidí investigar de qué se trata el teeing()método.

Devuelve un recopilador que es un compuesto de dos recopiladores posteriores. Cada elemento que se pasa al recolector resultante es procesado por ambos recolectores posteriores, luego sus resultados se combinan usando la función de combinación especificada en el resultado final.

Las funciones de recopilador resultantes hacen lo siguiente:

* proveedor: crea un contenedor de resultados que contiene contenedores de resultados obtenidos llamando al proveedor de cada recolector

* acumulador: llama al acumulador de cada colector con su contenedor de resultados y el elemento de entrada

* combinador: llama al combinador de cada colector con dos contenedores de resultados

* finalizador: llama al finalizador de cada recopilador con su contenedor de resultados, luego llama a la fusión proporcionada y devuelve su resultado.

- JavaDocs

De hecho, podemos reemplazar nuestra costumbre Collectorcon dos Collectorimplementaciones simples , una agregando filas de precios y la otra sumando el precio del carrito.

Veamos el código final y expliquemos línea por línea.

public PriceAndRows getPriceAndRows(Cart cart) {
  return cart.getProducts()
      .entrySet()
      .stream()
      .map(CartRow::new)                           // 1
      .collect(Collectors.teeing(                  // 2
          Collectors.reducing(                     // 3
              BigDecimal.ZERO,                     // 4
              CartRow::getRowPrice,                // 5
              BigDecimal::add),                    // 6
          Collectors.toList(),                     // 7
          PriceAndRows::new                        // 8
      ));
}

  1. Llamar al teeing()método
  2. El primer coleccionista calcula el precio. Es una simple reducing()llamada, con:
  3. El elemento de partida
  4. Una función para extraer un Pricede unCartRow
  5. A BinaryOperatorpara sumar dos precios juntos
  6. El segundo recopilador agrega el CartRowen una lista
  7. Finalmente, el último parámetro crea un nuevo objeto que agrega los resultados del primer y segundo colector.
  1. Extrae cada uno de los componentes individuales de ambos Collector, es decir , supplier(), `accumulator(), combiner()yfinisher()
  2. Los empareja uno al lado del otro
  3. Crea un solo nuevo Collectorpasando los pares

Espero que esta publicación te haya hecho considerar usar teeing() antes de crear un archivo Collector. ¡Gracias de nuevo a Miguel!

Por cierto, siempre estoy feliz de aprender cosas nuevas. En caso de que tenga ideas para compartir, puede usar el sistema de comentarios a continuación o Twitter.

El código fuente completo de esta publicación se puede encontrar en Github en formato Maven.

Para llegar más lejos:

  • Un ejemplo del mundo real de un recopilador de corrientes
  • Colectores personalizados en Java 8
  • Teeing Javadoc

Suggested posts

Configurar y usar Apache Kafka con Spring Boot

Kafka con bota de resorte

Configurar y usar Apache Kafka con Spring Boot

Introducción Apache Kafka es una plataforma de transmisión distribuida de código abierto que maneja la transmisión de datos en tiempo real tolerante a fallas, de alto rendimiento y a gran escala. El sistema se basa en un modelo de publicación-suscripción en el que los productores publican mensajes sobre temas y los consumidores se suscriben a esos temas para consumir los mensajes.

Dominar el desarrollo móvil: cómo elegir el mejor lenguaje de programación para su aplicación

Dominar el desarrollo móvil: cómo elegir el mejor lenguaje de programación para su aplicación

El desarrollo móvil se ha convertido en un componente vital para que las empresas tengan éxito en el mundo digital actual. Como desarrollador de aplicaciones móviles, es fundamental elegir el lenguaje de programación adecuado para crear su aplicación.

Related posts

Financiamiento de la eliminación de carbono en el año fiscal 24

El desglose de las solicitudes de asignaciones de Carbon180 a través de vías

Financiamiento de la eliminación de carbono en el año fiscal 24

Por Alyson Lee, asesora de gestión de asuntos gubernamentales El proceso de asignaciones anuales del gobierno federal es fundamental para nuestros esfuerzos por financiar la eliminación de dióxido de carbono (CDR). Cada año, Carbon180 envía solicitudes a varias oficinas del Congreso para ayudar a guiar hacia dónde fluirán los dólares del próximo año.

El asesinato de Jordan Neely y el problema del racismo “patriótico”

¿Puede Estados Unidos dar el paso esencial de no equiparar el comportamiento racista con ser un buen estadounidense?

El asesinato de Jordan Neely y el problema del racismo “patriótico”

[Alerta de activación: este ensayo incluye capturas de pantalla de personas que elogiaron al asesino de Jordan Neely.] Los funcionarios encargados de hacer cumplir la ley finalmente, y quizás a regañadientes, acusaron a Daniel Penny, el hombre que estranguló a Jordan Neely hasta que murió, por ese homicidio.

Revista abierta

Revista abierta

Diario abierto: una imagen al día. Siempre me han fascinado las historias.

El desafío de lectura de Goodreads es tóxico

El desafío de lectura de Goodreads es tóxico

La picazón en mi mano se extendió mientras negociaba con el librero local por otro libro. Este libro, como el resto que compré recientemente, encontraría su trono en mi pila de 'To Be Read' (TBR); y sin embargo, lo compré.