es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para volver a escribir el bucle utilizando un stream, podemos usar el método reduce en la lista de validators. El método reduce toma dos argumentos: un valor inicial y una función acumuladora. En este caso, el valor inicial sería el elemento inbound, y la función acumuladora aplicaría cada validador al elemento toValidate y devolvería el resultado.

    Así es como se puede reescribir el bucle utilizando streams:

    public Item applyValidations(Item inbound, Holder holder, Product product) {
        return validators.stream()
            .reduce(inbound, (toValidate, validator) -> validator.validate(toValidate, holder, product), (x, y) -> y);
    }
    

    En el código anterior, primero convertimos la lista de validators en un stream utilizando el método stream(). Luego llamamos al método reduce en el stream, pasando el elemento inbound 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 como inbound), y el segundo es un elemento del stream (validator en este caso). La expresión lambda aplica el método validate en el objeto validator 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 elemento toValidate después de que se hayan aplicado todos los validadores.

Comments are closed.