Java8特性之Optional

标签: Java

保留所有版权,请引用而不是转载本文(原文地址 https://yeecode.top/blog/16/ )。

1 概述

Java 8由Oracle公司于2014年3月18日发布,至今已过去数年之久。然而,直到今日仍有许多软件开发者对其相关特性不了解,这可能主要是Java教材更新缓慢的原因。为了使大家对与Java8的特性有全面系统的了解,本公众号将连续几篇文章介绍Java8中的各个特性。

Java8中新增的特性主要有:

本文介绍其中的Optional类。其它特性会在后续文章中陆续介绍。

2 Optional类

到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类已经成为Java 8类库的一部分。

Optional实际上是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

常用函数:

使用Optional,我们就可以把下面这样的代码进行改写。

public static String getName(User u) {
    if (u == null)
        return "Unknown";
    return u.name;
}

不过,千万不要改写成这副样子。

public static String getName(User u) {
    Optional<User> user = Optional.ofNullable(u);
    if (!user.isPresent())
        return "Unknown";
    return user.get().name;
}

这样改写非但不简洁,而且其操作还是和第一段代码一样。无非就是用isPresent方法来替代u==null。这样的改写并不是Optional正确的用法,我们再来改写一次。

public static String getName(User u) {
    return Optional.ofNullable(u)
                    .map(user->user.name)
                    .orElse("Unknown");
}

这样才是正确使用Optional的姿势。那么按照这种思路,我们可以安心的进行链式调用,而不是一层层判断了。

使用举例:

public class TestBean {
    public static void main(String[] args) {
        String nullString = null;
        Optional<String> optionalS1 = Optional.ofNullable(nullString);
        String normalString = "HelloWorld";
        Optional<String> optionalS2 = Optional.ofNullable(normalString);

        System.out.println("s1:" + optionalS1.orElse("None value fund!"));
        System.out.println("s2:" + optionalS2.orElse("None value fund!"));
        System.out.println("---");

        System.out.println(
                optionalS1
                        .map(a -> {System.out.print("do map...  ");return a.concat("+++");})
                        .orElse("None value!")
        );
        System.out.println(
                optionalS2
                        .map(a -> {System.out.print("do map...  ");return a.concat("+++");})
                        .orElse("None value!")
        );
    }
}

运行结果:

s1:None value fund!
s2:HelloWorld
---
None value!
has value.  HelloWorld+++

3 总结

Java8 提供的Optional类使得Java程序更为健壮,防止代码受到空值的污染。

关于Java8中Optional类的介绍就到这里,至此,通过前面的几篇文章和本文,我们对Java8中的特性进行了较为全面的介绍。希望大家在后续的编码中能使用这些特性,编写更加健壮和易读的代码。

本文首发于个人知乎:易哥(https://www.zhihu.com/people/yeecode),欢迎关注。

作者书籍推荐