使用 Java 8 避免在 lambda 中使用 null 的最佳方法是什么?



我有这个代码,我正在尝试弄清楚使用java 8的最佳方法避免null指针例外?

promotion.forEach(item ->
    item.getDiscount().getPromotions().forEach(promotion -> {
        // logic code here
    })
);

避免NullPoInterExceptions的最佳方法是避免零值。在您的示例中,请确保所有方法永远不会返回null。

而不是返回null,您有几个选择:

  • 扔一个充满活力。例如,如果方法的输入导致分区为零,则可以抛出异常而不是返回null。
  • 返回空的可选。例如,可以更改返回字符串的方法以返回可选的字符串。当没有字符串返回时,您返回可选。Empty()
  • 返回一个空集合(例如,当结果类型为列表时,如果没有找到结果,请返回一个空列表,而不是返回null)
  • 返回能够反映结果的自定义结果类型。例如,在进行验证时,您可以返回代表成功/失败和错误消息的验证,而不是在没有错误时返回null错误消息
promotion.stream()
    .map(item->item.getDiscount()).filter(Objects::nonNull)
    .map(discount->discount.getPromotions()).filter(Objects::nonNull)
    .forEach(innerPromotion->{//logic code});

在使用逻辑代码中使用所有空元素之前,您可以过滤所有空元素,以便只有非空元素才能运行逻辑代码。

您是否正在考虑诸如可选的事情:

item.getDiscount().getPromotions().stream().forEach(promotion ->     
    Optional.ofNullable(promotion).ifPresent(p -> {
        // logic code 
    } )
);

编辑:如果item.getDiscount()可能为null,则可以尝试:

Optional.ofNullable(item.getDiscount()).ifPresent(d -> 
    d.getPromotions().stream().forEach(promotion ->     
        Optional.ofNullable(promotion).ifPresent(p -> {
            // logic code 
        } )
    )
);

最新更新