Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在或不存在,原来用null表示一个值不存在,现在Optional可以更好的表达这个概念。并且可以避免空指针异常。
常用方法:
- Optional.of(T t):创建一个Optional实例。
- Optional.empty():创建一个空的Optional实例。
- Optional.ofNullable(T t):若t不为null,创建Optional实例,否则创建空实例。
- isPresent():判断是否包含值,若存在返回 true,否则为 false。
- orElse(T t):如果调用对象包含值,返回该值,否则返回t。
- orElseGet(Supplier s):如果调用对象包含值,返回该值,否则返回s获取的值。
- map(Function f):如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()。
- flatMap(Function mapper):与map类似,要求返回值必须是Optional。
例1:
/**
* Optional容器类常用方法
*/
public class TestOptional {
/**
* Optional.of(T t):创建一个Optional实例。
*/
@Test
public void test01() {
Optional<Employee> op = Optional.of(new Employee());
Employee employee = op.get();
System.out.println(employee);
//快速锁定空指针位置,此方法不能构建null实例
/*Optional<Object> o = Optional.of(null);
System.out.println(o.get());*/
}
/**
* Optional.empty():创建一个空的Optional实例。
*/
@Test
public void test02() {
Optional<Object> empty = Optional.empty();//创建空实例
System.out.println(empty.get());//获取不到值
}
/**
* Optional.ofNullable(T t):若t不为null,创建Optional实例,否则创建空实例。
*/
@Test
public void test03() {
Optional<Employee> op1 = Optional.ofNullable(new Employee());
System.out.println(op1.get());
/**
* isPresent():判断是否包含值,若存在返回 true,否则为 false。
*/
if (op1.isPresent()) {
System.out.println(op1.get());//获取不到值
}
Optional<Employee> op2 = Optional.ofNullable(null);//创建空实例
/**
* orElse(T t):如果调用对象包含值,返回该值,否则返回t。
*/
Employee employee1 = op2.orElse(new Employee("张三", 26, 8888.88, Employee.Status.BEAUTIFUL));
System.out.println(employee1);
/**
* orElseGet(Supplier s):如果调用对象包含值,返回该值,否则返回s获取的值。
*/
Employee employee2 = op2.orElseGet(() -> new Employee());
System.out.println(employee2);
}
/**
* map(Function f):如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()。
* flatMap(Function mapper):与map类似,要求返回值必须是Optional。
*/
@Test
public void test04() {
Optional<Employee> op = Optional.ofNullable(new Employee("张三", 26, 8888.88, Employee.Status.BEAUTIFUL));
Optional<String> name1 = op.map((emp) -> emp.getName());
System.out.println(name1.get());
Optional<String> name2 = op.flatMap((emp) -> Optional.of(emp.getName()));
System.out.println(name2.get());
}
}
例2:获取男人心中的女神名字,男人心中有女神,但不一定每个男人心中都有女神,而女神一定会有个名字。
原始方法处理空指针:
public class Man {
private Goddess goddess;//女神
public Man() {
}
public Man(Goddess goddess) {
this.goddess = goddess;
}
public Goddess getGoddess() {
return goddess;
}
public void setGoddess(Goddess goddess) {
this.goddess = goddess;
}
}
public class Goddess {
private String username;
public Goddess() {
}
public Goddess(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
@Test
public void test01() {
Man man = new Man();
String goddessName = getGoddessName(man);
System.out.println(goddessName);
}
/**
* 原始方法处理空指针:获取男人心中女神的名字
*
* @param man
* @return
*/
public String getGoddessName(Man man) {
//处理空指针异常
if (man != null) {
Goddess goddess = man.getGoddess();
if (goddess != null) {
return goddess.getUsername();
}
}
//默认返回
return "赵丽颖";
}
Java8中Optional类方法处理空指针:
public class NewMan {
private Optional<Goddess> goddess = Optional.empty();//空实例
public NewMan() {
}
public NewMan(Optional<Goddess> goddess) {
this.goddess = goddess;
}
public Optional<Goddess> getGoddess() {
return goddess;
}
public void setGoddess(Optional<Goddess> goddess) {
this.goddess = goddess;
}
}
@Test
public void test02() {
//传入 空实例时输出默认值
Optional<NewMan> newMan1 = Optional.ofNullable(null);
//传入 创建的男生实例但没有女神,输出默认值
Optional<NewMan> newMan2 = Optional.ofNullable(new NewMan());
//创建女神
Optional<Goddess> goddess = Optional.ofNullable(new Goddess("杨幂"));
//传入 创建的男生实例并且传入创建的女神实例,输出传入的女神实例名
Optional<NewMan> newMan3 = Optional.ofNullable(new NewMan(goddess));
System.out.println(getGoddessNameNew(newMan1));
System.out.println(getGoddessNameNew(newMan2));
System.out.println(getGoddessNameNew(newMan3));
}
/**
* Java8中Optional类方法处理空指针:获取男人心中女神的名字
* 注:传进来的newMan也可能为空所以要用Optional包装
*
* @param newMan
* @return
*/
public String getGoddessNameNew(Optional<NewMan> newMan) {
return newMan.orElse(new NewMan())
.getGoddess()
.orElse(new Goddess("赵丽颖"))
.getUsername();
}
转载请注明出处:BestEternity亲笔。