Java 8 流 - 避免 NPE

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

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

.map(metadata -> metadata.getLastUpdated().toInstant())

.map(TypeOfMetadata::getLastUpdated)
.map(TypeOfGetLastUpdated::toInstant)

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