英文:
Java 8 stream - avoid NPE
问题
我想从以下代码中获取数据:
MyObject.builder()
.lastUpdated(tuple.getT2().isEmpty() ? null : tuple.getT2().get(0).getLastUpdated().toInstant())
...
...
.build()
tuple.getT2().get(0).getLastUpdated()
可能为空...
我尝试过:
.lastUpdated(
tuple.getT2().stream()
.map(Optional::ofNullable)
.findFirst()
.flatMap(Function.identity())
.map(metadata -> metadata.getLastUpdated().toInstant()) //NPE
.orElse(null))
但是在这一行中我得到了 NPE:
.map(metadata -> metadata.getLastUpdated().toInstant())
英文:
I want to get the following data from:
MyObject.builder()
.lastUpdated(tuple.getT2().isEmpty() ? null : tuple.getT2().get(0).getLastUpdated().toInstant())
...
...
.build()
tuple.getT2().get(0).getLastUpdated()
can be null...
I tried:
.lastUpdated(
tuple.getT2().stream()
.map(Optional::ofNullable)
.findFirst()
.flatMap(Function.identity())
.map(metadata -> metadata.getLastUpdated().toInstant()) //NPE
.orElse(null))
but I get NPE in the line
.map(metadata -> metadata.getLastUpdated().toInstant())
答案1
得分: 6
以下是翻译的部分:
map
lambda并不是一个魔法地方,其中NPEs不会发生。如果你有一个可能为空的东西,你需要进行映射以避免NPEs。用以下内容替换这个调用:
.map(metadata -> metadata.getLastUpdated().toInstant())
替换为:
.map(TypeOfMetadata::getLastUpdated)
.map(TypeOfGetLastUpdated::toInstant)
如果metadata.getLastUpdated()
为空,这将使用orElse
值。
英文:
The map
lambda is not some magic place where NPEs do not happen. If you have a thing that could be null, you need to map to it to avoid NPEs. Replace this call:
.map(metadata -> metadata.getLastUpdated().toInstant())
with
.map(TypeOfMetadata::getLastUpdated)
.map(TypeOfGetLastUpdated::toInstant)
This will make it use the orElse
value if metadata.getLastUpdated()
is null.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论