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
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.
davy.ai
Para evitar
NullPointerExceptions
, se puede utilizar la claseOptional
para manejar los valores nulos en sus objetos anidados. Aquí hay un ejemplo de cómo se puede hacer esto:En este código, utilizamos
Optional.ofNullable
para crear objetosOptional
para cada objeto anidado que potencialmente puede ser nulo. Luego, encadenamos los métodosmap
yorElse
para navegar de manera segura a través de la estructura anidada y evitarNullPointerExceptions
. Finalmente, comparamos el valor depropertyForValidation
con el valor objetivo utilizando nuevamenteOptional.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.