Optional是一个没有子类的工具类,Optional是一个可以为null的容器类,代表一个值存在或不存在。它的作用主要是为了解决避免NUll检查,防止空指针异常。
1. Optional类的创建方式
1)Optional.of(T t):创建一个Optional实例
注意:of只能传入具体值,不能传入null,否则会抛空指针异常
2)Optional.empty():创建一个空的Optional实例
3)Optional.ofNullable(T t):若t不为null,创建optional实例,否则创建空实例
2. Optional类的常用方法
1)isPresent():判断是否包含值,包含值返回true,不包含值返回false
2)get():如果Optional有值则将其返回,否则抛出NoSuchElementException异常
3)orElse(T t):如果调用对象包含值,返回该值,否则返回参数t
例如:创建一个空的Optional,调用其orElse,返回值为orElse的参数值
public void test1(){
Optional<String> empty = Optional.empty();
String orElse = empty.orElse("默认值");
System.out.println(orElse);
}
输出结果:
4)orElseGet(Supplier s):如果调用对象包含值,返回该值,否则返回s获取的值
5)map(Function f):如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
public static void main(String[] args) {
Optional<String> op = Optional.ofNullable("abc");
Optional<String> map = op.map(str -> str.toUpperCase());
System.out.println(map.get());
}
6)flatMap(Function f):与map类似,要求返回值必须是Optional
7)ifPresent(Consymer consumer):如果有值,就调用参数,如果没值,就什么都不做
public void test1(){
Optional<String> o = Optional.of("张三");
o.ifPresent((str)->System.out.println(str));
}
运行结果:
3. Optional的用法demo
定义一个方法将User中的用户名转成大写并返回
@Test
public void test2(){
User u = new User();
u.setUsername("zhangsan");
Optional<User> optional = Optional.of(u);
changeUser(optional);
System.out.println(changeUser(optional));
}
public String changeUser(Optional<User> optional){
return optional.map(User::getUsername) // 转成String
.map(String::toUpperCase) // 转成大写
.orElse("null"); // 判空
}
运行结果:
小结:Optional是一个可以为null的容器对象,orElse,ifPresent,ifPresentOrElse,map等方法避免对null的判断,写出更加优雅的代码。