Manipulación de puntero nulo durante el uso de Lamda

Jigar Naik:

Va por debajo de código alguna vez nullPointerExceptiona menos e.getKey()retornosnull

Map<Integer, Optional<SecurityAttributeChange>> spnCreationDetails;
Optional.ofNullable(spnCreationDetails.get(e.getKey()).orElse(new SecurityAttributeChange()).getNewAttribute())
                                    .orElse(new SecurityAttr())
                                    .getUserName());

Me estoy haciendo NPE en esta línea, hay alguna forma de depurar este? Sé que spnCreationDetails.get(e.getKey())devuelve un valor nulo, me estoy perdiendo algo en el manejo de nullaquí?


- EDITAR


Aquí está el método casi completa que ayudará a dar su opinión sobre cómo refactorizar esto para que sea legible.

private void updateAuditFields(List<SecurityAttributeChange> securityChanges, Map<Integer, Map<String, Object>> result) {

    Map<Integer, Optional<SecurityAttributeChange>> spnModificationDetails = ...

    Map<Integer, Optional<SecurityAttributeChange>> spnCreationDetails = ...

    result.entrySet().stream().forEach(e -> {
        e.getValue()
                .put("userIdLastChanged",
                        Optional.ofNullable(Optional.ofNullable(spnModificationDetails.get(e.getKey()))
                                .orElse(Optional.of(new SecurityAttributeChange()))
                                .get()
                                .getNewAttribute()).orElse(new SecurityAttr()).getUserName());

        e.getValue()
                .put("lastChangedDatetime",
                        Optional.ofNullable(Optional.ofNullable(spnModificationDetails.get(e.getKey()))
                                .orElse(Optional.of(new SecurityAttributeChange()))
                                .get()
                                .getNewAttribute()).orElse(new SecurityAttr()).getKnowledgeBeginDate());

        e.getValue()
                .put("userIdCreated", Optional.ofNullable(
                        Optional.ofNullable(spnCreationDetails.get(e.getKey())).orElse(Optional.of(new SecurityAttributeChange())).get().getNewAttribute())
                        .orElse(new SecurityAttr())
                        .getUserName());

        e.getValue()
                .put("createdDatetime",
                        Optional.ofNullable(Optional.ofNullable(spnCreationDetails.get(e.getKey()))
                                .orElse(Optional.of(new SecurityAttributeChange()))
                                .get()
                                .getNewAttribute()).orElse(new SecurityAttr()).getKnowledgeBeginDate());

    });
}
Eran :

Si spnCreationDetails.get(e.getKey())puede ser nulo, es probable que tenga:

Optional.ofNullable(spnCreationDetails.get(e.getKey()))
        .orElse(new SecurityAttributeChange())
        .getNewAttribute()
        .orElse(new SecurityAttr())
        .getUserName();

es decir, spnCreationDetails.get(e.getKey())debe ser envuelto con un Optional.

EDIT: Al ver su comentario, spnCreationDetails.get(e.getKey())pueden regresar ya sea un nullo un Optional<SecurityAttributeChange>, por lo que sería mejor para transformar sólo el nullen una nueva Optional:

spnCreationDetails.getOrDefault(e.getKey(),Optional.empty())
                  .orElse(new SecurityAttributeChange())
                  .getNewAttribute()
                  .orElse(new SecurityAttr())
                  .getUserName();            

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=335053&siteId=1
Recomendado
Clasificación