[简]这个Optional到底是啥,基本用法?

萌新在Discord上问我Optional这个东西到底是什么,干啥用的。这个Optional是Java 8中引入的“新”特性。简单地说:但凡用Optional包裹的变量在获取其值之前都必须进行非空判断。说白了,就是一个带有强制性非空校验的Wrapper。
举个例子:

public class DataProvider {
    ...
    /**
     * 通过提供的参数name在数据库中查找Person
     **/
    public Person findOneByName(String name) {
        ....
        return person;
    }
}

上面的DataProvider.findOneByName(name)方法返回一个Person实例。如果,数据库中不存在所查找的人,这个方法返回null,否则,返回Person。那么,下面的调用代码可能需要进行这样的非空判断:

public class MyClass {
    ....
    private void processPerson() {
        ....
        Person person = dataProvider.findOneByName("Joe");
        if (person == null) {
            //person is null, log, throw exception, etc.
        } else {
            //process person.
        }
    }
}

如果写DataProvider的人没有良好的注释或说明findOneByName方法可能返回空值,或者,调用findOneByName方法的人没注意到这一点而忘记做非空判断。那么,在调用findOneByName方法时很有可有会出现NPE(NullPointerException)。为什么说是“很有可能”?因为如果查询的Person在数据库中存在的话,调用代码端就不会出现NPE。
我们现在用Optional来改写一下DataProvider中的findOneByName方法。

public class DataProvider {
    ...
    /**
     * 通过提供的参数name在数据库中查找Person
     **/
    public Optional<Person> findOneByName(String name) {
        ....
        return Optional.ofNullable(person);  //显式的告诉JVM这个person实例可能是个null值。
    }
}

在上面的代码中,findOneByName方法返回一个用Optional包裹的person,而非直接person。这么一搞,在调用这个方法时,调用端拿着Optional<Person>就没法直接当成Person来用了。想用,可以,先解包。所以,看下面的代码:

public class MyClass {
    ....
    private void processPerson() {
        ....
        Optional<Person> optionalPerson = dataProvider.findOneByName("Joe");
        Person person = null;
        if (optionalPerson.isPresent()) {    //判断Optional中的Person是否为null。
            person = optionalPerson.get();  //从Optional中取出Person。
            //process person.
        } else {
            //person is null, log, throw exception, etc.
        }
    }
}

当然,Optional还提供了很多方法,结合lambda表达式,可以大大精简if-else代码结构,比如:orElse()和orElseGet()等。你们自己摸索去吧。本文已经解释清楚了Optional的意图、作用和基本用法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 原创:扣钉日记,欢迎分享,转载请保留出处。 简介 要说Java中什么异常最容易出现,我想NullPointerEx...
    扣钉日记阅读 3,021评论 0 0
  • 关于java8 Optional 文档版本:v1.0版本 和C/C++不一样,java从一开始就尝试将指针彻底的包...
    比轩阅读 9,202评论 1 22
  • 前言 NPE(NullPointerException)一直是Java程序员最深恶痛绝的异常,冗长的非空校验使代码...
    技术深耕阅读 3,093评论 0 0
  • 简介   java8里提供的Optional类,简单来讲是个容器类,可以放任意类型对象,以及null。  它的存在...
    湘西刺客王胡子阅读 9,585评论 0 1
  • 自从实习结束后直到现在将近一年多的时间再也没有用过kotlin, 在今年五月份I/O大会上,Google再次明确了...
    Scus阅读 5,321评论 0 0

友情链接更多精彩内容