代码之家  ›  专栏  ›  技术社区  ›  Matelutex

Java8流-避免NPE

  •  0
  • Matelutex  · 技术社区  · 4 年前

    我想从中获取以下数据:

    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())
    
    0 回复  |  直到 4 年前
        1
  •  6
  •   Sweeper    4 年前

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

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

    具有

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

    这将使它使用 orElse 值if metadata.getLastUpdated() 为空。