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.

Stream API allMatch() con varios objetos anidados nullable

Estoy trabajando en una función de validación de solicitudes en la que necesito verificar si un determinado valor de cadena está presente en una propiedad que se encuentra en un objeto, que a su vez está contenido como un valor de una entrada de mapa, y ese mapa es parte de otro objeto y, finalmente, mi cuerpo de solicitud contiene un conjunto de esos objetos.

Para intentar dejarlo más claro, recrearé mi situación utilizando solo partes de código que son importantes.

Digamos que mi ClaseA se recibe en el cuerpo de la solicitud, y tiene las siguientes propiedades:

@Nullable
Set mySet = null;

Ahora, tenemos ClassB, que tiene un cierto objeto envoltorio de tipo ClassC:

@Nullable
ClassC classC;

Esa clase de envoltorio ClassC contiene un mapa:

@Nullable
Map<String, ClassD> classDMap = new HashMap<>;

Finalmente, ClassD contiene la propiedad que se debe verificar si contiene un determinado valor:

@Nullable
String propertyForValidation;

En este momento, he utilizado un código que se ve así:

public boolean isValid(ClassA body) {
return body.getMySet().stream()
.allMatch(x -> x.getClassC().getClassDMap().values().stream()
.allMatch(y -> y.getPropertyForValidation.equals(“someValue”));
}

El problema actual con mi código es que no funciona como se espera cuando algunos de los objetos que he descrito anteriormente son nulos, ya que obtengo muchas NullPointerExceptions. Supongo que esto se puede solucionar con muchos ifs y comprobaciones de nulos, pero me preguntaba si hay una forma más elegante de hacerlo usando Stream API?

Cualquier ayuda es apreciada, gracias.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para evitar NullPointerExceptions, se puede utilizar la clase Optional para manejar los valores nulos en sus objetos anidados. Aquí hay un ejemplo de cómo se puede hacer esto:

    public boolean isValid(ClassA body) {
        return body.getMySet().stream()
            .allMatch(x -> Optional.ofNullable(x.getClassC())
                .map(ClassC::getClassDMap)
                .map(Map::values)
                .orElse(Collections.emptySet()).stream()
                .allMatch(y -> Optional.ofNullable(y.getPropertyForValidation())
                    .orElse("").equals("someValue")));
    }
    

    En este código, utilizamos Optional.ofNullable para crear objetos Optional para cada objeto anidado que potencialmente puede ser nulo. Luego, encadenamos los métodos map y orElse para navegar de manera segura a través de la estructura anidada y evitar NullPointerExceptions. Finalmente, comparamos el valor de propertyForValidation con el valor objetivo utilizando nuevamente Optional.ofNullable para manejar valores nulos.

    Este enfoque es más elegante que una serie de declaraciones if y verificaciones de nulos, y aún utiliza la API de Stream para realizar la validación en todos los objetos en el conjunto de entrada.

Comments are closed.