Java每当 Java 8 中避免 Null 检查

在 Java 8 中避免 Null 检查

原文:Avoid Null Checks in Java
8

译者:ostatsu

来源:在 Java 8 中避免 Null
检查

什么样防 Java 中著名的 NullPointerException 异常?这是每个 Java
初学者迟早会问到之关键问题之一。而且当中和高档程序员也以连规避之错误。其是时至今日
Java 以及广大外编程语言中不过盛行的一律栽错误。

Null 引用的发明者 Tony
Hoare
在 2009 年道歉,并遂这种似是而非吧外的十亿美元错误。

我拿其称作自己之十亿美元错误。它的阐发是在1965
年,那时我用一个面向对象语言(ALGOL
W)设计了第一独全面的援类型系统。我之目的是管所有援的行使还是纯属安全之,编译器会自动进行反省。但是我不能抵御住诱惑,加入了
Null
引用,仅仅是以实现起来非常容易。它导致了累不根本的失实、漏洞和体系崩溃,可能当随后
40 年遭受导致了十亿美元的损失。

不顾,我们要使直面她。所以,我们究竟会举行些什么来防范
NullPointerException 异常与否?那么,答案显而易见是针对性其上加 null 检查。由于
null 检查或挺辛苦和痛苦的,很多语言为处理 null
检查添加了新鲜的语法,即空合并运算符
—— 其在像
Groovy

Kotlin
这样的语言中吗吃号称 Elvis 运算符。

噩运之是 Java 没有提供这样的语法糖。但有幸的是即刻当 Java 8
中取得了改善。这首文章介绍了哪运用像 lambda 表达式这样的 Java 8
新特征来防范编写不必要之 null 检查的几乎独技术。

以 Java 8 中增长 Null 的安全性

自我已经在旁一样篇稿子丁验证了俺们好什么利用
Java 8 的 Optional 类型来严防 null 检查。下面是那篇稿子中之以身作则代码。

倘我们来一个像这么的好像层次结构:

class Outer {
    Nested nested;
    Nested getNested() {
        return nested;
    }
}
class Nested {
    Inner inner;
    Inner getInner() {
        return inner;
    }
}
class Inner {
    String foo;
    String getFoo() {
        return foo;
    }
}

釜底抽薪这种组织的深层嵌套路径是发硌麻烦的。我们必须编制一堆 null
检查来确保不见面招一个 NullPointerException:

Outer outer = new Outer();
if (outer != null && outer.nested != null && outer.nested.inner != null) {
    System.out.println(outer.nested.inner.foo);
}

我们得以经过应用 Java 8 的 Optional 类型来解脱所有这些 null 检查。map
方法接收一个 Function 类型的 lambda 表达式,并自行将每个 function
的结果包装成一个 Optional 对象。这如果我们能当一行中开展多只 map
操作。Null 检查是当底层自动处理的。

Optional.of(new Outer())
    .map(Outer::getNested)
    .map(Nested::getInner)
    .map(Inner::getFoo)
    .ifPresent(System.out::println);

还有同种实现均等作用的法门就是经过使用一个 supplier
函数来解决嵌套路径的题目:

Outer obj = new Outer();
resolve(() -> obj.getNested().getInner().getFoo());
    .ifPresent(System.out::println);

调用 obj.getNested().getInner().getFoo()) 可能会见弃来一个
NullPointerException
异常。在这种状态下,该大将会晤为抓获,而该方法会返回 Optional.empty()。

public static <T> Optional<T> resolve(Supplier<T> resolver) {
    try {
        T result = resolver.get();
        return Optional.ofNullable(result);
    }
    catch (NullPointerException e) {
        return Optional.empty();
    }
}

求记住,这半个缓解方案或者没风 null
检查那么高的性能。不过以大部分状况Java下未会见发生极要命题材。

譬如往一模一样,上面的演示代码都托管在
GitHub。

祝编码愉快!

相关文章