JDK8 Optional
JDK8 Optional
我们经常会在代码里去判断对象是否为null,以避免NPE的问题。JDK8提供了Optional类配合函数编程和流式编程去更加优雅的处理Optional。
一、API
Optional的构造函数被private修饰了,即只能用它提供的2个静态方法创建对象:
of(T t) 只能接受不为null的对象,否则抛异常
ofNullable(T t) 可以接受为null的对象
empty() 返回一个空值的对象,且为单例,每次返回的都是一样的
boolean isPresent() 判断value是否为空,一般不推荐使用,如果使用该方法进行判断,那么和if xx == null 就没有任何区别了
void ifPresent(Consumer<? super T> consumer) 接收一个函数式接口(即只有一个方法,且被@FunctionaInterface修饰),如果
get() 获得value值
值不为空则为调用该接口的方法。
public void add(Person person) {
Optional.of(person).ifPresent(list::add);
/**
* 等同于代码
* if (null != person){
* list.add(person);
* }
*/
}
orElse(value) 如果为null,返回一个值
public String getName() {
return Optional.ofNullable(this.name).map(r -> name).orElse("default");
/**
* 等同于
* if (this.name == null){
* return "default";
* }else{
* return this.name
* }
*/
}
orElseGet() 通orElse一样,只是参数需要传一个函数
public String getName() {
return Optional.ofNullable(this.name).map(r -> name).orElseGet(() -> "defualt".toUpperCase());
/**
* 等同于
* if (this.name == null){
* return "default".toUpperCase();
* }else{
* return this.name;
* }
*/
}
orElseThrow()
public String getName() {
return Optional.ofNullable(this.name).map(r -> name).orElseThrow(()-> new NullPointerException());
/**
* 等同于
* if (this.name == null){
* throw new NullPointerException();
* }else{
* return this.name;
* }
*/
}
map() 对Optional中保存的值进行函数运算,并返回新的Optional(可以是任何类型)
Optional<String> s = Optional.of(person).map(r -> r.getName());
flatMap() 和map()基本一样,只是传入的函数返回值不同
Optional<String> s1 = Optional.of(person).flatMap(r -> Optional.of(r.getName()));
filter(Predicate):判断Optional对象中保存的值是否满足Predicate,并返回新的Optional。
Person person = new Person("eragon",30);
Optional<Person> o1 = Optional.ofNullable(person);
// 判断age如果大于30才打印
o1.filter(p -> p.getAge() > 30).ifPresent(System.out::println);
二、如何使用Optional
1.不要使用isPersent(),因为和使用if判断非空没有区
if (Optional.ofNullable(person).isPresent()) {
System.out.println(person.getName());
}
应该使用
Optional.ofNullable(person).ifPresent(p-> System.out.println(p.getName()));
2.嵌套的循环if判断非空可以使用,如果是简单的if判断没有太大必要
if (null != person) {
if (null != person.getCar()) {
return person.getCar().getName();
}
}
throw new RuntimeException("a poor man,don't have a car");
应该使用
return Optional.ofNullable(person)
.map(r -> r.getCar())
.map(c -> c.getName())
.orElseThrow(()->new RuntimeException("a poor man ,don't have a car"));
上一篇: JDK8 - Optional