一、这个类是解决空指针
以前对null的处理:
public class OptionalTest01 {
public static void main(String[] args) {
//String name = "张山";
String name = null;
if(name !=null){
System.out.println("字符串长度:" + name.length());
}else{
System.out.println("字符串为空");
}
}
}
二、 Optional类是一个没有子类的工具类
Optional类是可以为null的容器对象,它的主要作用是为了避免Null检查,防止NullPointerException
三、基本使用
Optional对象的创建方式:
public class OptionalTest02 {
public static void main(String[] args) {
//通过of方法创建
Optional<String> zhangsan = Optional.of("zhangsan");
//of方法不支持null
//Optional<Object> o = Optional.of(null);
//通过ofNullable方法
Optional<String> zhagnsan = Optional.ofNullable("zhagnsan");
//ofNullable方法支持null
Optional<Object> o1 = Optional.ofNullable(null);
}
}
Optional常用方法:
public class OptionalTest03 {
public static void main(String[] args) {
//get():如果Optional有值则返回,否则抛出NoSuchElementException: No value present异常
Optional<String> op1 = Optional.of("zhangsan");
String s = op1.get();
System.out.println(s);
Optional<String> op2 = Optional.empty();
//System.out.println(empty.get());
//isPersent(): 判断是否包含值,如果有值则返回true,否则返回false
Optional<String> op3 = Optional.of("zhangsan");
if(op3.isPresent()){
String s1 = op3.get();
System.out.println("用户名称:"+s1);
}
Optional<Object> op4 = Optional.empty();
if(op4.isPresent()){
System.out.println(op4.get());
}else{
System.out.println("op4是一个空对象");
}
//orElse(T t) 有值就返回,没值就返回t
String s1 = op1.orElse("李四");
System.out.println(s1);
Object op2else = op2.orElse("op2else");
System.out.println(op2else);
//orElseGet(Supplier s):如果调用对象包含值就返回该值,否则返回Lambda表达式的返回值
String o = op2.orElseGet(() -> "hello");
System.out.println(o);
}
}
Optional高级使用:
public class OptionalTest04 {
public static void main(String[] args) {
Person p = new Person("zhangshan",18);
Optional<Person> p1 = Optional.of(p);
String upperForOptional = getUpperForOptional(p1);
System.out.println(upperForOptional);
}
/**
* 根据Person对象,将name转换为大写,老写法,啰嗦没逼格
*/
public String getUpperName(Person person){
if (person != null) {
if(person.getName() != null){
String name = person.getName();
return name.toUpperCase();
}else{
return null;
}
}else{
return null;
}
}
/**
* 新写法,代码干净(有逼格)
*/
public static String getUpperForOptional(Optional<Person> op){
if(op.isPresent()){
String s = op.map(p -> p.getName())
.map(n -> n.toUpperCase())
.orElse(null);
return s;
}else{
return null;
}
}
}
输出:ZHANGSHAN