盒子
盒子
文章目录
  1. 为什么使用optional
  2. 创建方法
  3. 常用方法

Guava之Optional优雅的使用null

为什么使用optional

使用Optional除了赋予null语义,增加了可读性,最大的优点在于它是一种傻瓜式的防护。Optional迫使你积极思考引用缺失的情况,因为你必须显式地从Optional获取引用。
如同输入参数,方法的返回值也可能是null。和其他人一样,你绝对很可能会忘记别人写的方法method(a,b)会返回一个null,就好像当你实现method(a,b)时,也很可能忘记输入参数a可以为null。将方法的返回类型指定为Optional,也可以迫使调用者思考返回的引用缺失的情形。

接口文档 https://google.github.io/guava/releases/snapshot-jre/api/docs/
github地址 https://github.com/google/guava


创建方法

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

例子:

1
2
3
4
5
6
7
8
9
10
11
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

}


常用方法

  • boolean isPresent():如果Optional包含的T实例不为null,则返回true;若T实例为null,返回false
  • T get():返回Optional包含的T实例,该T实例必须不为空;否则,对包含null的Optional实例调用get()会抛出一个IllegalStateException异常
  • T or(T):若Optional实例中包含了传入的T的相同实例,返回Optional包含的该T实例,否则返回输入的T实例作为默认值
  • T orNull():返回Optional实例中包含的非空T实例,如果Optional中包含的是空值,返回null,逆操作是fromNullable()
  • Set asSet():返回一个不可修改的Set,该Set中包含Optional实例中包含的所有非空存在的T实例,且在该Set中,每个T实例都是单态,如果Optional中没有非空存在的T实例,返回的将是一个空的不可修改的Set。
    例子:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    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