Optional简述(Java8新特性)

Optional类是Java8为了解决null值判断问题,借鉴google guava类库的Optional类而引入的一个同名Optional类,使用Optional类可以避免显式的null值判断(null的防御性检查),避免null导致的NPE(NullPointerException)。总而言之,就是对控制的一个判断,为了避免空指针异常。

一、引言

首先我们看下面一段代码,肯定会很熟悉

public static String getGender(Student student){

    if(null == student){
        return "Unkown";
    }

    return student.getGender();
        
}

从上面看出,就是对这个实例是不是空做了判断,然后我们看下使用java8 的Optional类之后的代码,挺实用的。

public static String getGender(Student student){

   return Optional.ofNullable(student).map(u -> u.getGender()).orElse("Unkown");
        
}

二、Optional类介绍

Optional 类主要特点说明下:

  1. 构造方法是私有,不能new来创建,
  2. Optional的三个静态方法来创建对象,【empty()、of()、ofNullable()】
// 1、创建一个包装对象值为空的Optional对象
Optional optStr = Optional.empty();
// 2、创建包装对象值非空的Optional对象
Optional optStr1 = Optional.of("optional");
// 3、创建包装对象值允许为空的Optional对象
Optional optStr2 = Optional.ofNullable(null);

三、Optional类的使用

1. get方法

        直接放回包装对象的实际值,为null抛出异常

2. isPresent方法

        判断包装对象是否为空

3.  ifPresent方法

        不为空时进行操作,内部自动判断null处理

public static void printName(Student student){

    Optional.ofNullable(student).ifPresent(u ->  System.out.println("The student name is : " + u.getName()));

}

4. filter方法

        用于对Optional对象进行过滤

public static void filterAge(Student student){

    Optional.ofNullable(student).filter( u -> u.getAge() > 18).ifPresent(u ->  System.out.println("The student age is more than 18."));
    
}

5. map方法

        map()方法的参数为Function(函数式接口)对象,map()方法将Optional中的包装对象用Function函数进行运算,并包装成新的Optional对象。

public static Optional getAge(Student student){

    return Optional.ofNullable(student).map(u -> u.getAge()); 

}

6. flatMap方法

        map()方法不同的是,入参Function函数的返回值类型为Optional类型,而不是U类型,这样flatMap()能将一个二维的Optional对象映射成一个一维的对象。

public static Optional getAge(Student student){

    return Optional.ofNullable(student).flatMap(u -> Optional.ofNullable(u.getAge())); 
}

7. orElse方法

        如果包装对象值非空,返回包装对象值,否则返回入参other的值(默认值)。

public static String getGender(Student student){

   return Optional.ofNullable(student).map(u -> u.getGender()).orElse("Unkown");
        
}

8. orElseGet方法

        orElseGet()方法与orElse()方法类似,区别在于orElseGet()方法的入参为一个Supplier对象,用Supplier对象的get()方法的返回值作为默认值。

public static String getGender(Student student){

    return Optional.ofNullable(student).map(u -> u.getGender()).orElseGet(() -> "Unkown");      

}

9. orElseThrow方法

        用于包装对象值为空时需要抛出特定异常的场景。

public static String getGender1(Student student){

    return Optional.ofNullable(student).map(u -> u.getGender()).orElseThrow(() -> new RuntimeException("Unkown"));      

}

        Optional开发时要注意正确使用Optional格式,谨慎使用isPresent()和get()方法,尽量多使用map()、filter()、orElse()等方法来发挥Optional的作用。

你可能感兴趣的:(java,开发语言)