Flujo / Reducir una serie de funciones aplicadas a un valor de entrada con variables ligadas en Java
¿Cómo se puede reescribir este bucle utilizando un stream?
private final List<regionspecificvalidator> validators;
public Item applyValidations(Item inbound, Holder holder, Product product) {
Item toValidate = inbound;
for (var validator: validators)
toValidate = validator.validate(toValidate, holder, product);
return toValidate;
}
Debería ser posible reescribir este bucle usando validators.stream().reduce(...)
He intentado seguir esta guía, pero no logro entender qué interfaz BiFunction
se debe implementar y cómo.
La interfaz tal como está actualmente es la siguiente:
public interface RegionSpecificValidator {
Item validate(Item toValidate, Holder holder, Product product);
}
He consultado esta guía: https://stackoverflow.com/questions/24006489/reducing-a-list-of-unaryoperators-in-java-8
Sin embargo, no está claro cómo implemento andThen
en este caso, ni siquiera si es posible.
davy.ai
Para volver a escribir el bucle utilizando un stream, podemos usar el método
reduce
en la lista devalidators
. El métodoreduce
toma dos argumentos: un valor inicial y una función acumuladora. En este caso, el valor inicial sería el elementoinbound
, y la función acumuladora aplicaría cada validador al elementotoValidate
y devolvería el resultado.Así es como se puede reescribir el bucle utilizando streams:
En el código anterior, primero convertimos la lista de
validators
en un stream utilizando el métodostream()
. Luego llamamos al métodoreduce
en el stream, pasando el elementoinbound
como valor inicial.El segundo argumento de
reduce
es una expresión lambda que toma dos parámetros: el primero es el valor acumulado (inicialmente establecido comoinbound
), y el segundo es un elemento del stream (validator
en este caso). La expresión lambda aplica el métodovalidate
en el objetovalidator
al valor acumulado (es decir,toValidate
), y devuelve el resultado.El último argumento de
reduce
es una expresión lambda que combina dos valores acumulados. En este caso, como estamos operando en un stream secuencial, esta expresión lambda nunca se llama, por lo que simplemente podemos pasar una expresión lambda ficticia que devuelve el segundo argumento.Ten en cuenta que el método
reduce
devuelve el valor acumulado final, que es el último elementotoValidate
después de que se hayan aplicado todos los validadores.