java - 使用 lambda 时处理空指针

标签 java java-8

除非 e.getKey() 返回 null,否则下面的代码是否会得到 nullPointerException

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

我在这一行中遇到了 NPE,是否可以调试它?我知道 spnCreationDetails.get(e.getKey()) 返回 null,我在这里处理 null 时遗漏了什么吗?


- 编辑


这是几乎完整的方法,有助于提供有关如何重构它以使其可读的输入。

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());

    });
}

最佳答案

如果spnCreationDetails.get(e.getKey())可以为空,您可能需要:

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

spnCreationDetails.get(e.getKey())应该用Optional包裹.

编辑:看到您的评论,spnCreationDetails.get(e.getKey())可以返回 nullOptional<SecurityAttributeChange> , 所以最好只转换 null进入一个新的Optional :

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

关于java - 使用 lambda 时处理空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56358794/

相关文章:

java - 使用 lambda 表达式时在变量中存储一些值

java - Tomcat 废话 : stop vs kill

java - 如何在 Stream 上短路 reduce?

lambda - 如何流式传输 2 个列表并修改 1 中的值

java - 解析查询: return a value from the done() method in the class?

java - 为什么 Stream Parallel() 不使用所有可用线程?

java - 在 play WS 响应范围中读取变量值

java - Hibernate JPA 递归查询

Java从mysql数据库错误填充jcombobox

java - 为什么 `%4.` 在我的号码中添加空格?