【问题标题】:Java 8 Optional to do null check in hierarchical objectsJava 8 可选在分层对象中进行空检查
【发布时间】:2018-03-05 23:28:24
【问题描述】:

在对象克隆不同类型的对象时使用 Optional 进行空检查。

class A{ C cObj; List<B> bList;}

class B{ C cObj; List<C> cList;}

class C { String label; String value;}

class D{ String name; String age; String addressCode;}

映射 A -> D

d.setAddessCode(A.getBlist().get(0).getcList().get(0).getValue());

如何使用 java 8 optional 来检查 null

A.getBlist().get(0).getcList().get(0).getValue()

我试过了

d.setAddessCode(Optional.ofNullable(A).map(A::getBList).map(Stream::of).orElseGet(Stream::empty).findFirst().map(B::getCList).map(Stream::of).orElseGet(Stream::empty).findFirst().map(C::getValue).orElse(null)));

如何在 List 和 value 中同时检查 null。

【问题讨论】:

  • 如何从 C 到 D?
  • 来自 B 的 orElseGet(Stream::empty) 应该已经为你做这件事了,不是吗?
  • 为什么只做空检查?如果bList 非空但为空怎么办?

标签: java object java-8 java-stream optional


【解决方案1】:

无需使用 Streams。这是带有空检查和空检查的代码:

d.setAddressCode(Optional.ofNullable(a)
                         .map(A::getbList)
                         .filter(bList -> ! bList.isEmpty())
                         .map(bList -> bList.get(0))
                         .map(B::getcList)
                         .filter(cList -> ! cList.isEmpty())
                         .map(cList -> cList.get(0))
                         .map(C::getValue)
                         .orElse(null));

这可以通过一些辅助方法来简化:

public class MyUtils {
    public static <E> E getFirst(List<E> list) {
        return (list == null || list.isEmpty() ? null : list.get(0));
    }
}
d.setAddressCode(Optional.ofNullable(a)
                         .map(A::getbList)
                         .map(MyUtils::getFirst)
                         .map(B::getcList)
                         .map(MyUtils::getFirst)
                         .map(C::getValue)
                         .orElse(null));

【讨论】:

  • 如果列表中的第一个元素是null怎么办?
  • @LukeLee 那么addressCode 将是null
  • @LukeLee 你认为?您是否阅读过文档,即map() 的javadoc?如果你这样做了,你就会知道它是否会导致 NPE。
  • 我的错,我误会了。 :)
  • 你为什么要做那个多余的list == null-签入getFirst?摆脱明确的null-checks 不是重点吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 2015-05-30
  • 1970-01-01
相关资源
最近更新 更多