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
public class OptionalTest {
// Optional.of(T t) : 创建一个 Optional 实例
@Test
public void test1(){
Optional<Employee> op = Optional.of(new Employee());
Employee emp = op.get();
System.out.println(emp);//Employee{name='null', age=0, salary=0.0}
//注意:Optional.of(null)会报空指针异常,也就是说如果报空指针异常能快速定位到null的位置
}
//Optional.empty() : 创建一个空的 Optional 实例
@Test
public void test2(){
Optional<Employee> op = Optional.empty();//创建空的实例
System.out.println(op.get());//空指针异常
}
//Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
@Test
public void test3(){
Optional<Employee> op = Optional.ofNullable(null);//创建了一个空的实例
System.out.println(op.get());//可以快速定位到哪里报空指针异常
}
//isPresent() : 判断是否包含值
@Test
public void test4(){
Optional<Employee> op = Optional.ofNullable(null);//创建了一个空的实例
if (op.isPresent()) { //判断是否包含值
System.out.println(op.get());//不做任何事
}
Optional<Employee> opt = Optional.ofNullable(new Employee());
if (opt.isPresent()) { //判断是否包含值
System.out.println(opt.get());//Employee{name='null', age=0, salary=0.0}
}
}
//orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
@Test
public void test5(){
Optional<Employee> op = Optional.ofNullable(null);//创建了一个空的实例
Employee em = op.orElse(new Employee("zhangSan",34,500));
System.out.println(em);//Employee{name='zhangSan', age=34, salary=500.0}
Optional<Employee> opt = Optional.ofNullable(new Employee());
Employee emp = opt.orElse(new Employee("zhangSan",34,500));
System.out.println(emp);//Employee{name='null', age=0, salary=0.0}
}
//orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
@Test
public void test6(){
Optional<Employee> op = Optional.ofNullable(null);
Employee emp = op.orElseGet(() -> new Employee());//这里是函数式接口,可以写自己想要的逻辑
// Employee employee = op.orElseGet(() -> {}) //这里是函数式接口,可以写自己想要的逻
System.out.println(emp);//Employee{name='null', age=0, salary=0.0}
}
//map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
//flatMap(Function mapper):与 map 类似,要求返回值必须是Optional
@Test
public void test7(){
Optional<Employee> op = Optional.ofNullable(new Employee("zhangSan",34,400));
Optional<String> str = op.map((e) -> e.getName());
System.out.println(str.get());//zhangSan
Optional<String> str2 = op.flatMap((e) -> Optional.of(e.getName()));
System.out.println(str2.get());//zhangSan
}
}