除非 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())
可以返回 null
或 Optional<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/