Java8新特性-Optional类

1. 什么是Optional类

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

Optional<T> 类(java.util.Optional) 是一个容器类,他可以保存类型 T 的值,代表这个值存在。或者仅仅保存 null,表示这个值不存在。原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常

Optional 类的 Javadoc 描述如下:这是一个可以为 null 的容器对象。如果值存在则 i s P r e s e n t ( ) isPresent() isPresent() 方法会返回 true,调用 g e t ( ) get() get() 方法会返回该对象。

Optional 类提供很多很有用的方法,这样我们就不用显示进行空值检测

2. Optional类的常用方法

一般而言:

  1. 对象一定非空的,使用 O p t i o n a l . o f ( T Optional.of(T Optional.of(T t ) t) t) T T T g e t ( ) get() get() 方法搭配;
  2. 对象可能为空的,使用 O p t i o n a l . o f N u l l a b l e ( T Optional.ofNullable(T Optional.ofNullable(T t ) t) t) T T T o r E l s e ( T orElse(T orElse(T o t h e r ) other) other) 方法搭配;
    在这里插入图片描述

3. 演示1:创建 Optional类对象

首先,定义两个辅助类:

// Boy 类(辅助演示)
public class Boy {
    private Girl girl;
    public Boy() {
    }
    public Boy(Girl girl) {
        this.girl = girl;
    }
    public Girl getGirl() {
        return girl;
    }
    public void setGirl(Girl girl) {
        this.girl = girl;
    }
    @Override
    public String toString() {
        return "Boy{" +
                "girl=" + girl +
                '}';
    }
}
// Girl 类(辅助演示)
public class Girl {
    private String name;
    public Girl() {
    }
    public Girl(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Girl{" +
                "name='" + name + '\'' +
                '}';
    }
}

创建Optional 类的三种方式:

public class Main {

    public static void main(String[] args) {

        Girl girl = new Girl();

        // Optional.of(T t): 创建一个Optional 实例,t必须非空
        Optional<Girl> optionalGirl = Optional.of(girl);

        // Optional.empty():创建一个空的Optional 实例
        Optional<Object> empty = Optional.empty();

        // Optional.ofNullable(T t):创建一个Optional 实例,t可以为空
        Optional<Object> optionalNull = Optional.ofNullable(null);
        Optional<Girl> optionalGirl2 = Optional.ofNullable(girl);
    }
}

4. 演示2:利用Optional 优化空指针

在使用 Optional 类之前,如果想获得一个男孩所拥有的女孩的姓名需要像这样写。

// 以前防止空指针异常的常见方式
public String getGirlName(Boy boy) {
	if (boy != null) {
		Girl girl = boy.getGirl();
		if (girl != null) {
			return girl.getName();
		}
	}
	return null;
}

当使用了Optional 类之后,可以进一步对可能为空的值进行包装,优化代码。

// 使用了Optional 类的 getGrilName()
public String getGirlName(Boy boy) {
	// 因为boy 可能本身就是null,因此先用Option.ofNullable()包装一下
	Optional<Boy> boyOptional = Option.ofNullable(boy);
	// orElse:若传进来的boy非空则返回boy,否则返回指定的备胎
	Boy boy = boyOptional.orElse(new Boy(new Girl("当前传入的男孩为null")));
	Girl girl = boy.getGirl(); 
	// 此时 girl可能为 null
	Optional<Girl> girlOptional = Optional.ofNullable(girl);
	// orElse:若传进来的girl非空则返回girl,否则返回指定的备胎
	Girl girlValue = girlOptional.orElse(new Girl("男孩所拥有的女孩为null"));
	// 此时girlValue一定非空
	return girlValue.getName();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铁头娃撞碎南墙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值