Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。
常用方法:
Optional.of(T t) : 创建一个 Optional 实例
Optional.empty() : 创建一个空的 Optional 实例
Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
isPresent() : 判断是否包含值
orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
flatMap(Function mapper):与 map 类似,要求返回值必须是Optional
1)Optional.of(T t) : 创建一个 Optional 实例
示例:
public class Employee {
private Integer id;
private String name;
private Integer age;
private double salary;
private Status Status;
public enum Status{
FREE,
BUSY,
VOCATION;
}
//...省略 getter/setter、toString、构造器方法
}
@Test
public void test() {
Optional<Employee> optional = Optional.of(new Employee());
Employee emp = optional.get();
System.out.println(emp);
}
输出:
Employee [id=null, name=null, age=null, salary=0.0, Status=null]
但是注意:如果传入的值是null,则会报空指针异常的错误。
2)Optional.empty() : 创建一个空的 Optional 实例
示例:
public class Employee {
private Integer id;
private String name;
private Integer age;
private double salary;
private Status Status;
public enum Status{
FREE,
BUSY,
VOCATION;
}
//...省略 getter/setter、toString、构造器方法
}
@Test
public void test() {
Optional<Employee> optional = Optional.empty();
System.out.println(optional.get());
}
上述运行会报错,原因是创建了一个空的Optional,使用空对象调用get()方法自然就报错了。
3)
Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
isPresent() : 判断是否包含值
示例:
public class Employee {
private Integer id;
private String name;
private Integer age;
private double salary;
private Status Status;
public enum Status{
FREE,
BUSY,
VOCATION;
}
//...省略 getter/setter、toString、构造器方法
}
@Test
public void test() {
Optional<Employee> optional_1 = Optional.ofNullable(null);
Optional<Employee> optional_2 = Optional.ofNullable(new Employee());
if (optional_1.isPresent()) {
System.out.println("optional_1:"+optional_1.get());
}
if (optional_2.isPresent()) {
System.out.println("optional_2:"+optional_2.get());
}
}
输出:
optional_2:Employee [id=null, name=null, age=null, salary=0.0, Status=null]
4)orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
示例:
public class Employee {
private Integer id;
private String name;
private Integer age;
private double salary;
private Status Status;
public enum Status{
FREE,
BUSY,
VOCATION;
}
//...省略 getter/setter、toString、构造器方法
}
@Test
public void test() {
//
Optional<Employee> optional = Optional.ofNullable(null);
Employee emp = optional.orElse(new Employee("张三",17,1888));
System.out.println(emp);
}
输出:
Employee [id=null, name=张三, age=17, salary=1888.0, Status=null]
5)orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
示例:
public class Employee {
private Integer id;
private String name;
private Integer age;
private double salary;
private Status Status;
public enum Status{
FREE,
BUSY,
VOCATION;
}
//...省略 getter/setter、toString、构造器方法
}
@Test
public void test() {
Optional<Employee> optianal = Optional.ofNullable(null);
Employee emp = optianal.orElseGet(() -> new Employee());
System.out.println(emp);
}
输出:
Employee [id=null, name=null, age=null, salary=0.0, Status=null]
orElseGet方法的参数是一个Supplier ,前面的一篇 Java8特性之内置函数式接口 ,我们已经讲过了Supplier ,这是一个供给型接口,用于生成对象。
6)
map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
flatMap(Function mapper):与 map 类似,要求返回值必须是Optional
这两个的使用方法跟Stream的map() 、flatMap方法类似,这里不做赘述,可以看之前的博客Java8特性之Stream流