请教:JAVA8里的Optional.empty()怎么用的?

见端而知末 2020-05-09 05:19:27
请教:JAVA8里的Optional.empty()怎么用的?
在网上看到各种教程和博文都没有看到,为什么会有这么一个方法。
一个空的Optional对象有什么用呢,能不能举个例子。
...全文
4000 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
android_cai_niao 2020-05-11
  • 打赏
  • 举报
回复 10
首先,你要知道Optional类是干嘛用的,它是用于包装一个对象的,当你要使用这个包装对象的时候,你要先问问Optional它包装的对象是不是null,是的话你就要小心空指针了,这就是Optional类的功能。 然后你再看一下epmty()的方法说明就知道了呀,如下: 英文不好的话可以使用有道词典翻译: Returns an empty Optional instance. No value is present for this Optional. 返回一个空的Optional对象,这个Optional对象中没有值。也就是说Optional里面包装的对象为null。 Though it may be tempting to do so, avoid testing if an object is empty by comparing with == against instances returned by Option.empty(). There is no guarantee that it is a singleton. Instead, use isPresent(). 尽管这样做可能很诱人,但请通过将==与Option.empty()返回的实例进行比较来避免测试对象是否为空。不能保证它是一个单例。替代的,使用isPresent()。 这方法说明,一看就懂了吧,如果不懂写个代码测试一下就明白了:
        
String name = null;
Optional<String> nameOpt = Optional.ofNullable(name);
Optional<String> emptyOpt = Optional.empty();
System.out.println(nameOpt == emptyOpt);
输出结果为true,这下明白了吧,方法的说明已经告诉你了,当你要判断一个对象是否为空是,使用==跟Optional.empty()比较即可,另外代替的方式也可使用isPresent()方法来判断一个对象是否为null。 如果你要想,为什么这两个对象可以用==来比较,不是应该使用equals吗?这时你可以再看一下Optional.ofNullable()这个方法的文档,如下: Returns an Optional describing the specified value, if non-null, otherwise returns an empty Optional. 如果值是非空的,则返回描述指定值的Optional,否则返回empty的Optional。 这下懂了吧,如果值是null,则返回empty的Optional。 甚至,你可以看一下ofNullable的源码,如下:

public static <T> Optional<T> ofNullable(T value) {
    return value == null ? empty() : of(value);
}
调用多次empty()方法返回的Optional对象使用==可以返回true,说明了什么呢?说明了empty()每次返回的都是同一个对象,所以可以使用==来比较,不信就看一下源码,如下:

    private static final Optional<?> EMPTY = new Optional<>();
    public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }
看到这里,唯一让我不明白的是empty()方法中的一句话There is no guarantee that it is a singleton(无法保证它是一个单例).看这源码明明是单例啊,而且是一个饿汉式的单例,这种单例是线程安全的,怎么就不能保证它是一个单例呢?如果不能保证是单例的话,为什么要叫我们用==来测试对象是否为空呢?除非有道词典的翻译是错误的: avoid testing if an object is empty by comparing with == against instances returned by Option.empty() 这个可能是这样翻译的:避免使用==那Optional.empty()返回的实现比较来判断一个对象是否为空。 有英文好的过来说一下么?这上面的英文正确的翻译应该是什么? 如果是这样理解的话,那Optional.empty()的作用应该就只有一个了,节省内存,避免创建多个值为null的Optional对象,因为Optional.ofNullable()方法接收的对象如果是null就使用返回empty()方法创建的Optional,而且这个Optional是返回一个静态的实例对象,所以多次调用empty返回的是同一个Optional对象,目前看来empty返回的对象是单例的,文档说不保证是单便,那就是说他以后也可以把final修符去掉,那就不是单例了嘛!
见端而知末 2020-05-10
  • 打赏
  • 举报
回复
引用 1 楼 sotondolphin 的回复:
可以用 Optional.empty() 代替null, 避免抛出NullPointerException 异常
能举个例子吗?
sotondolphin 2020-05-09
  • 打赏
  • 举报
回复 1
可以用 Optional.empty() 代替null, 避免抛出NullPointerException 异常

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧