空指针异常在java中是最常见也是最恶心的一种异常,这个时候就时候Java展现了自己有容乃大的气度,就去借鉴了Google著名的项目Guava,其中引入了Optional类,所Java也就大气的借鉴了(开玩笑)。
Optional 类(java.util.Optional
)的引入很好的解决空指针异常。
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样就不用显式进行空值检测。
Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
说实话如果在上面的理论,我也懵逼,所以理论先复制黏贴,然后看代码理解。而这个目前更是侧重于用。
类方法
首先先看其拥有的方法,
创建Optional 类对象的方法
方法 | 作用 |
---|---|
Optional.of(T t) | 创建一个Optiona实例,t不能是null。 |
Optional empty() | 创建一个空Optiona实例。 |
Optional.ofNullable(T t) | 创建一个Optiona实例,t可以是null。 |
判断Optional容器是否包含对象
方法 | 作用 |
---|---|
boolean isPresent() | 判断是否含有对象 |
void ifPresent(Consumer<? super T> consumer) | 如果优质就执行consumer接口实现的代码,并且该值会作为参数传给它 |
获取Optional容器对象
方法 | 作用 |
---|---|
T get() | 如果调用对象包含值,返回该值,否则抛出异常 |
T orElse(T t) | 如果有值则将其返回,否则返回指定的other对象 |
T orElseGet(Supplier< ? extends T> other) | 如果有值则将其返回,否则返回指定的由Supplier接口实现的对象对象 |
代码演示
其实对于这个类,更侧重是对其使用,所以用代码将上面的方法进行简单的演示。
首先先声明一个自定义类
class person{
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public person(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
}
下面的代码演示都是依托于上面的对象类进行操作的。
首先举出一个会报空指针异常。
Person person= new Person("张三");
System.out.println(person.getName());
// 但是有时候在程序中就会出一种可能,那就是声明的对象可能会为空
person= null;
System.out.println(person.getName());
optional类演示
创建optional类
// of 方法
Person person= new Person("张三");
Optional op =Optional.of(person);
op =Optional.of(person);
System.out.println(op); //Optional[test1.Person@4b67cf4d]
person= null;
op =Optional.of(person); //Exception in thread "main" java.lang.NullPointerException
// empty 方法
Person person= new Person("张三");
Optional op =Optional.of(person);
op =Optional.of(person);
System.out.println(op); //Optional[test1.Person@4b67cf4d]
op =Optional.empty();
System.out.println(op);// Optional.empty
// ofNullable 方法 这看结果可以看出是 有点像是上面两种的结合 所以这个是最常见的创建Optional类
Person person= new Person("张三");
Optional op =Optional.of(person);
op =Optional.of(person);
System.out.println(op); //Optional[test1.Person@4b67cf4d]
person= null;
op =Optional.ofNullable(person);
System.out.println(op); //Optional.empty
判断容器是否包含对象
// isPresent 方法
Person person= new Person("张三");
Optional op =Optional.of(person);
op =Optional.of(person);
System.out.println(op.isPresent()); //true
person= null;
op =Optional.ofNullable(person);
System.out.println(op.isPresent()); //false
// isPresent 方法
Person person= new Person("张三");
Optional op =Optional.of(person);
op =Optional.of(person);
// 因为op这个地方不为空所以无法运行参数方法
op.ifPresent(t->System.out.println("这个为空") );
person= null;
op =Optional.ofNullable(person);
op.ifPresent(t->System.out.println("这个为空") );// 这个为空
获取对象
// get 方法
Person person= new Person("张三");
Optional op =Optional.of(person);
op =Optional.of(person);
System.out.println(op.get());//Person{name='张三'}
person= null;
op =Optional.ofNullable(person);
System.out.println(op.get());//Exception in thread "main" java.util.NoSuchElementException: No value present
所以上面的代码需要进行一下修改,才不可能报错:
Person person= new Person("张三");
Optional op =Optional.of(person);
op =Optional.of(person);
if(op.isPresent()){
System.out.println(op.get());//Person{name='张三'}
}
如果只是这样的话,添加了一个判断语句,那我再
Person person= new Person("张三");
System.out.println(person.getName());
// 但是有时候在程序中就会出一种可能,那就是声明的对象可能会为空
person= null;
if(person!=null){
System.out.println(person.getName());
}
如果只是简单的这个那就没有多少意思,毕竟一个类的出现是为了更加方便或者是对以前繁琐代码的优化。继续写几行代码演示。
//orElse方法
Person person= new Person("张三");
Optional<Person> op =Optional.ofNullable(person);
Person person1=op.orElse(new Person("李四1"));
System.out.println(person1.getName());//张三
person= null; //如果使用 person=new Person(); //对象值为:Person{name='null'}
op =Optional.ofNullable(person);
person1=op.orElse(new Person("李四2"));
System.out.println(person1.getName());//李四2
// 用对象判断if 判断也行
Person person= new Person("张三");
System.out.println(person.getName());
// 但是有时候在程序中就会出一种可能,那就是声明的对象可能会为空
person= null;
if(person!=null){
person=new Person("李四2");
}
System.out.println(person.getName());
//orElseGet 方法 (下面if对象的写法就不在演示)
Person person= new Person("张三");
Optional<Person> op =Optional.ofNullable(person);
Person person1=op.orElseGet(()-> new Person("李四1"));
System.out.println(person1.getName()); //张三
person= null; //如果使用 person=new Person(); //对象值为:Person{name='null'}
op =Optional.ofNullable(person);
person1=op.orElseGet(()-> new Person("李四2"));
System.out.println(person1.getName());//李四2
个人感觉:
整体用完,个人感觉这个类出现的单独使用的话个人感觉有点鸡肋,其存在的最大意义个人觉得的为Strean服务。不过再具体深入的话,本人就没有过多的深入研究了。