Java 8新增的类-Optional
Optional作用
Java8中新增了Optional类,Optional类相当于一个容器,这个容器可以包含一个null,也可以包含任何非null的对象。
这个类有两个作用(目的):
- 让消除代码中的NullPointerExecption的代码更优雅
- 处理对象为null,不为null的情况下的代码变得更简洁
按照功能分类Optional类的API
Optional
类的Api按照功能,可分为以下几类:
创建Optional实例的api,包括empty()
、of()
、ofNullable()
,返回的是一个Optional
实例
Optaional中的value为null时,做什么的api,包括orElse()
、orElseGet()
、orElseThrow()
,返回值是Optional
中的vlaue
Optaional中的value不为null时,做什么的api,包括ifPresent()
、map()
、flatMap()
,其中ifPresent()
不返回任何值,map()
、flatMap()
返回一个新的Optional
对象
其它分类,get()
、isPresent()
、filter()
Optional在实际中的应用
getListName()
返回名字列表。如果list
为null
,则创建一个empty list
返回,否则就返回list
。使用了Optioanal
中的orElse()
方法来替代传统的if..else..
,让代码看起来更加简洁。
/**
* 返回名字列表
*
* @return
*/
@Test
public List<String> getListName() {
/*Java8之前的写法*/
/*
List<String> list = null;
if (list == null) {
return Collections.emptyList();
} else {
return list;
}
*/
/*Java8 Optional写法*/
List<String> list = null;
return Optional.of(list).orElse(Collections.emptyList());
}
nameFormatDemo()
名字首字母大写,如果name!=null
则首字母转换为大写,如果name==null
,则赋予no name
值。
/**
* 名字首字母大写
*/
@Test
public void nameFormatDemo() {
final String DEFAULT_NAME = "no name";
/*Java8之前的写法*/
String name = "tom";
if (name != null) {
name = name.substring(0, 1).toUpperCase() + name.substring(1, name.length());
}else{
name = DEFAULT_NAME;
}
System.out.println(String.format("Java8之前的写法,name:%s", name));
/*Java8 Optional写法*/
name = "tom";
//name = null;
Optional<String> nameOptional = Optional.ofNullable(name);
name = nameOptional.map(value -> value.substring(0, 1).toUpperCase() + value.substring(1, value.length())).orElse(DEFAULT_NAME);
System.out.println(String.format("Java8 Optional写法,name:%s", name));
}
printName()
打印名字到控制台。name!=null
则打印name
到控制台,否则什么也不做。ifPresent()
的作用是Optional
中的value
为null时,执行传递函数,否则什么也不做。
/**
* 打印名字到控制台
*/
@Test
public void printName(){
String name = "Tom";
/*Java8之前的写法*/
if (name != null) {
System.out.println(String.format("name:%s",name));
}
/*Java8 Optional写法*/
Optional.ofNullable(name).ifPresent(value -> System.out.println(String.format("name:%s",value)));
}
使用Optional注意事项
使用这个类需要注意以下几点:
- Optional不能作为字段或方法参数的类型,这个类只是一个工具类
- Optional 类型不可被