1.Optional类介绍
Optional是一个没有子类的工具类,Optional是一个可以为null的容器对象。它的作用主要是为了解决避免Null检查,防止NullPointerException。
2.Optional类的创建方式
import java.util.Optional;
public class Demo {
public static void main(String[] args){
//of:只能传入一个具体值,不能传入null
//ofNullable:既可以传入具体值
//empty:存入的是null
//Optional<String> op1=Optional.of("王初冬");
//Optional<String> op1=Optional.of(null);
//Optional<String> op2=Optional.ofNullable("王初冬");
//Optional<String> op2=Optional.ofNullable(null);
Optional<Object> op3=Optional.empty();
}
}
3.Optional类的isPresent方法
import java.util.Optional;
public class Demo {
public static void main(String[] args){
Optional<String> op1=Optional.of("王初冬");
//判断Optional中是否有具体值,有值则返回true,没有值则返回false
boolean present = op1.isPresent();
System.out.println("present = "+present);
}
}
执行上述代码,其输出结果为:
present = true
4.Optional类的get方法
import java.util.Optional;
public class Demo {
public static void main(String[] args){
Optional<String> op1=Optional.of("王初冬");
//获取Optional中的值,如果有值则返回具体值,没有值则报错
System.out.println(op1.get());
}
}
5.Optional中的orElse方法
orElse:如果Optional中有值,就取出这个值;如果没有值,就使用参数指定的值
import java.util.Optional;
public class Demo {
public static void main(String[] args){
Optional<String> userName=Optional.of("南宫仆射");
String name =userName.orElse("王初冬");
System.out.println("name="+name);
}
}
6.Optional中的ifPresent方法
ifPresent:如果Optional存在值的话,则调用Lambda表达式
import java.util.Optional;
public class Demo {
public static void main(String[] args){
Optional<String> userName=Optional.of("王初冬");
userName.ifPresent(s ->{
System.out.println("有人:"+s);
});
}
}
7.Optional中的map方法
public class Demo {
public static void main(String[] args){
User u = new User("王初冬",18);
String upperUserName = getUpperUserName(u);
System.out.println(upperUserName);
}
// 定义一个方法将User中的用户名转成大小并返回
public static String getUpperUserName(User u){
if(u!=null){
String userName = u.getUserName();
if(userName!=null){
return userName.toUpperCase();
}else {
return null;
}
}else{
return null;
}
}
}
上述为传统方式来事项,如果采用Optional,其修改为如下:
import java.util.Optional;
public class Demo {
public static void main(String[] args){
User u = new User("王初冬",18);
Optional<User> op=Optional.of(u);
System.out.println(getUpperUserName(op));
}
public static String getUpperUserName(Optional<User> op){
//String upperUserName=op.map(u->u.getUserName())
// .map(s-> s.toUpperCase())
// .orElse("null");
String upperUserName=op.map(User::getUserName).map(String::toUpperCase).orElse("null");
return upperUserName;
}
}
总结:Optional是一个可以为null的容器对象,orElse、ifPresent、map等方法避免对null的判断,写出更加优雅的代码