Optional是java8引入的新api。他有效的处理了if对空指针等情况的判断。让代码更简洁。
我们下面主要针对下个这个类进行操作
class Book {
public String name;
public String getName() {
return name;
}
}
Optional的创建
Optional的创建有3中。这里只说两种。因为另外一种实在没有找到合适的场景
Optional.ofNullable();
Optional.empty()
第一个是接收一个可以为空的值。
第二个是创建一个空的Optional。
针对空指针取默认值
写程序往往是如果对象是null,可能赋值给一个固定值返回。
Optional<Book> userOptional = Optional.ofNullable(book);
String hello = userOptional.map(Book::getName).orElse("hello");
System.out.println(hello);
这里主要是创建Optional后,先map获取对象的数据,如果是空就会返回hello。
这个在字段少的时候用处可能不明显。但是在嵌套层次比较多的时候。
userOptional.map(Book::getName).map().map().orElse("hello");
可以在层层取数据的时候用map或者flatmap获取字段数据。最终写成一行,要比不断的写if判断明显省去了不少代码。
针对空指针抛出异常
我们也遇到一种情况,例如判断为空的时候要抛出自定义异常,中断操作。
Optional<Book> userOptional = Optional.ofNullable(book);
String error = userOptional.map(Book::getName).orElseThrow(() -> new RuntimeException("name is null"));
过滤出需要的值
如果获取到的值不少null,也有一些匹配的操作在里面,例如找出名字里是张开头的书、
Optional<Book> userOptional = Optional.ofNullable(book);
String bookName = userOptional.map(Book::getName).filter((name) -> name.contains("张")).get();
System.out.println(bookName);
使用filter可以帮助我们做值的过滤
如果存在某个值,就做一些操作
我们判断完值的存在可能需要做一些后续的操作,例如出现了有张的书名的书,就执行购买。
Optional<Book> userOptional = Optional.ofNullable(book);
userOptional.map(Book::getName).filter((name) -> name.contains("张")).ifPresent(name -> System.out.println("购买"+name));
ifPresent后面可以跟一个Consumer,可以帮忙做后面的操作内容。
提供需要条件的默认值
如果对象为null,有的时候是可以确定知道返回什么样的值,有的是需要获取当前数据的,需要动态的数值,例如时间戳等等。
optional提供了orElseGet的方法。这个和orElse有一些区别。我们直接看源码。
public T orElse(T other) {
return value != null ? value : other;
}
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
orElseGet是可以提供一个Supplier来提供对象的产生。但是orElse是提供对象本身。我们可以根据return的时候可以看出。orElseGet的意思是只有在为null的时候才触发了构造,可以说具有延迟构造对象的作用。
如果存在某个值,就做一些操作,否则做另外一些操作
上面讲了通过ifPresent可以在存在某些值的时候做一些操作。如果有反向操作,就只能依靠ifPresent返回一个bool类型,然后再写if判断。
java9解决了这个问题。
Optional<Book> userOptional = Optional.ofNullable(book);
userOptional.map(Book::getName).filter((name) -> name.contains("张")).
ifPresentOrElse(name -> System.out.println("购买"+name),()->{
System.out.println("回家");
});
加入了ifPresentOrElse,可以多加一个Runnable。用来执行null的时候的情况。
数据stream
这个也是9以后带来的特性。Optional可以转化为流。
转为流能带来更多的方便的操作,对于元素特别多的要返回的时候,原来是做不到这样的效果的,但是stream可以collect。
共同学习,写下你的评论
评论加载中...
作者其他优质文章