Java--8--新特性--Optional--有效防止空指针异常
Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。
下面是这个类的一些常用方法!
package OptionalP; import LambdaP.Employee; import org.junit.Test; import java.util.Optional; public class Optional1 { /* * Optional 容器类:用于尽量避免空指针异常 * Optional.of(T t) : 创建一个 Optional 实例 * Optional.empty() : 创建一个空的 Optional 实例 * Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例 * isPresent() : 判断是否包含值 * orElse(T t) : 如果调用对象包含值,返回该值,否则返回t * orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值 * map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty() * flatMap(Function mapper):与 map 类似,要求返回值必须是Optional */ @Test public void test(){ //Optional.of(T t) : 创建一个 Optional 实例 Optional<Employee> employee = Optional.of(new Employee()); System.out.println(employee.get());//LambdaP.Employee{name='null', age=0, salary=0} //of方法是不能构建一个null对象的,否则会报错 NullPointerException 虽然报空指针,但是这时候我们就不需要一个个的Debug了,直接就能锁定出错行 //Optional.empty() : 创建一个空的 Optional 实例 Optional<Object> empty = Optional.empty(); System.out.println(empty.get()); //empty方法是构建一个新的空Optional对象,Optional中的内容是空的但是Optional对象不是空的,这时候调用get方法获取内容会出错 //NoSuchElementException: No value present //Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例 Optional<Object> o = Optional.ofNullable(null); System.out.println(o.get()); //ofNullable是允许构建一个空对象的,但是同上面一个一样,是无法获取里面的值的,因为没值 //报错java.util.NoSuchElementException: No value present //isPresent() : 判断是否包含值 Optional<Employee> employees = Optional.ofNullable(null); if(employees.isPresent()){ System.out.println("不为空"); }else { System.out.println("为空"); } //为空 由此就可以看出,如果Optional中包含内容的话那么他会返回true,否则返回false //orElse(T t) : 如果调用对象包含值,返回该值,否则返回t Optional<Object> objectOptional = Optional.ofNullable(null); Object orElse = objectOptional.orElse(new Employee("orElse", 11, 1555)); System.out.println(orElse); //LambdaP.Employee{name='orElse', age=11, salary=1555} 可以看出orElse作用了,如果是空就返回后面指定创建的,否则就返回ofNullable后封装的对象 //orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值 Optional<Object> o2 = Optional.ofNullable(null); Object o1 = o2.orElseGet(() -> 1); System.out.println(o1); // 1 orElseGet 里面是要求的是一个供给型接口Supplier ,所以就可以根据我们的需求随意的处理和返回任何东西 //map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty() Optional<Employee> o3 = Optional.ofNullable(new Employee("orElse", 11, 1555)); Optional<Integer> integer = o3.map((e) -> e.getSalary() + 100000); System.out.println(integer); //Optional[101555] 现在就对封装的对象中的工资进行了操作 //flatMap(Function mapper):与 map 类似,要求返回值必须是Optional Optional<Employee> orElse4 = Optional.ofNullable(new Employee("orElse", 11, 1555)); Optional<Integer> integer4 = orElse4.flatMap((e) -> Optional.ofNullable(e.getSalary() + 100000)); System.out.println(integer4); //Optional[101555] //这里需要注意的是返回值必须是一个封装以后的Optional对象 } }
上面就是一些基本的Optional的操作方法!