【问题标题】:Java 8 stream - avoid NPEJava 8 流 - 避免 NPE
【发布时间】:2020-07-28 10:37:24
【问题描述】:

我想从中获取以下数据:

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(metadata->metadata.getLastUpdated()).map(date->date.toInstant()).orElse(null)?
  • 那么问题是什么?

标签: java java-stream optional


【解决方案1】:

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

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

与

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

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

【讨论】:

    猜你喜欢
    • 2014-05-03
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 2021-11-15
    • 1970-01-01
    • 2021-01-11
    相关资源
    最近更新 更多