Optional在java8中的另一个热门API,为开发者解决的痛点是:NullPointException 问题
构造方法
- Optional.of(Object object):入参object不能为空,否则会抛出空指针异常
- Optional.ofNullable(Object object):入参object可以为空,如果object不为空,就创建一个Optional实例;如果object为空就返回一个static fainal的Option对象,注意这里不会新建Option实例,而是使用一个static final的实例EMPTY
- Optional.empty():就是上面分析Optional.ofNullable的时候用到的empty方法,直接返回一个static final的实例EMPTY;
常用函数列表:
ifPresent:T值如果不为空,将一个Lambda表达式作为输入。
orElse:如果在T可能空时你需要一个值的话,那么可以使用 orElse(),它能在T值存在的情况下返回这个值,否则返回输入值。
orElseGet: 方法类似于orElse(),但是不是直接返回输入参数,而是调用输入参数,返回调用的结果,这个输入参数通常是lambda。
orElseThrow:是在当遭遇Null时,决定抛出哪个Exception时使用。
map:能够返回另外一个(处理后的)Optional。
get:如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException。示例代码如下:
package com.java8.optional;
/**
* Description: <br>
*
* @author: name:yuxin <br>email: yuruixin@ixincheng.com <br>
* Create Time: 2018/3/31 0031-下午 5:39<br>
*/
public class Person {
private int id;
private int age;
private String name;
public Person(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.java8.optional;
import java.util.Optional;
/**
* Description: <br>
*
* @author: name:yuxin <br>email: yuruixin@ixincheng.com <br>
* Create Time: 2018/3/31 0031-下午 5:40<br>
*/
public class PersonService {
private static final Person DEFAULT = new Person(1,18,"jack");
public Person queryById(int id){
return null;
}
public Person getPersonBeforeJava8(int id){
Person person = queryById(id);
return person==null?DEFAULT:person;
}
public Person getPsersonAfterJava8(int id){
Optional<Person> person = Optional.ofNullable(queryById(id));
return person.orElse(DEFAULT);
}
public Person getPsersonAfterJava8OrElseGet(int id){
Optional<Person> person = Optional.ofNullable(queryById(id));
return person.orElseGet(()->new Person(1,28,"yuxin"));
}
public static void java8OptionalMap(){
Stream<Person> persons = Stream.of(new Person(1,18,"jack"),new Person(2,28,"yuxin"));
Optional<Person> p = persons
.filter(person -> person.getName().startsWith("yu"))
.findFirst();
// p.ifPresent((pp)->System.out.println(pp.getName()));
Optional<String> s = p.map((ppp) -> ppp.getName());
System.out.println(s.get());
}
}