Java 8 流 - 避免 NPE

Mat*_*ley 0 java optional java-stream

我想从以下位置获取以下数据:

MyObject.builder()
    .lastUpdated(tuple.getT2().isEmpty() ? null : tuple.getT2().get(0).getLastUpdated().toInstant())
...
...
.build()
Run Code Online (Sandbox Code Playgroud)

tuple.getT2().get(0).getLastUpdated() 可以为空...

我试过:

.lastUpdated(
                        tuple.getT2().stream()
                            .map(Optional::ofNullable)
                            .findFirst()
                            .flatMap(Function.identity())
                            .map(metadata -> metadata.getLastUpdated().toInstant()) //NPE
                            .orElse(null))
Run Code Online (Sandbox Code Playgroud)

但我得到了 NPE

.map(metadata -> metadata.getLastUpdated().toInstant())
Run Code Online (Sandbox Code Playgroud)

Swe*_*per 6

map拉姆达是不是有些神奇的地方,NPE上不会发生。如果你有一个可能为空的东西,你需要映射到它以避免 NPE。替换此调用:

.map(metadata -> metadata.getLastUpdated().toInstant())
Run Code Online (Sandbox Code Playgroud)

.map(TypeOfMetadata::getLastUpdated)
.map(TypeOfGetLastUpdated::toInstant)
Run Code Online (Sandbox Code Playgroud)

orElse如果metadata.getLastUpdated()为空,这将使它使用该值。