Google Guava之Optional优雅的使用null

Optional用法详解
本文介绍了Java 8中Optional类的基本用途及优势,包括避免空指针异常、提高代码可读性和减少复杂度等方面。详细解释了Optional的各种创建方法及其常用API,通过示例展示了如何在实际开发中使用Optional。

为什么使用optional

使用Optional<T>除了简化粗鲁的if(null == object)、降低函数的复杂度、增加可读性之外,它是一种傻瓜式的防护,Optional<T>引导编码人员主动的思考引用为null的情况。

创建方法

Optional.of(T):获得一个Optional对象,其内部包含了一个非null的T数据类型实例,若T=null,则立刻报错。
Optional.absent():获得一个Optional对象,其内部包含了空值
Optional.fromNullable(T):将一个T的实例转换为Optional对象,T的实例可以不为空,也可以为空[Optional.fromNullable(null),和Optional.absent()等价。

例子:

    public static void testNull(){
        //one
        Integer nubmerone=4;
        Optional<Integer> integerOptional = Optional.of(nubmerone);//若引用为null则快速失败触发java.lang.NullPointerException
        //two
        Optional<Integer> nullOptional=Optional.absent();//创建引用缺失的Optional实例,就是为NULL的
        //three
        Optional<Integer> possible = Optional.fromNullable(5);  //创建允许null值的Optional

    }

 

常用方法

  1. boolean isPresent():如果Optional包含的T实例不为null,则返回true;若T实例为null,返回false
  2. T get():返回Optional包含的T实例,该T实例必须不为空;否则,对包含null的Optional实例调用get()会抛出一个IllegalStateException异常
  3. T or(T):若Optional实例中包含了传入的T的相同实例,返回Optional包含的该T实例,否则返回输入的T实例作为默认值
  4. T orNull():返回Optional实例中包含的非空T实例,如果Optional中包含的是空值,返回null,逆操作是fromNullable()
  5. Set<T> asSet():返回一个不可修改的Set,该Set中包含Optional实例中包含的所有非空存在的T实例,且在该Set中,每个T实例都是单态,如果Optional中没有非空存在的T实例,返回的将是一个空的不可修改的Set。

例子:

    public static void testNull(){
        testMethodReturn();
    }

    public static void testMethodReturn() {
        Optional<Long> value = method();//获得一个Optional对象,其内部包含了空值
        if(value.isPresent()==true){
            System.out.println("获得返回值: " + value.get());
        }else{
            //value是空值,返回输入的值
            System.out.println("1、获得返回值: " + value.or(-12L));
        }
        //value是空值,返回null
        System.out.println("2、获得返回值 orNull: " + value.orNull());

        Optional<Long> valueNoNull = methodNoNull();//获得一个Optional对象,值为15
        if(valueNoNull.isPresent()==true){
            Set<Long> set=valueNoNull.asSet();//返回一个不可修改的Set
            System.out.println("3、获得返回值 set 的 size : " + set.size());
            //返回Optional包含的T实例
            System.out.println("4、获得返回值: " + valueNoNull.get());
        }else{
            System.out.println("获得返回值: " + valueNoNull.or(-12L));
        }
        //引用值不为null,返回引用值
        System.out.println("5、获得返回值 orNull: " + valueNoNull.orNull());
    }

运行结果

1、获得返回值: -12
2、获得返回值 orNull: null
3、获得返回值 set 的 size : 1
4、获得返回值: 15
5、获得返回值 orNull: 15

 

转载于:https://www.cnblogs.com/zhangyaxiao/p/8464549.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值