简单来说,Opitonal是Java8的新特, Optional是Java提供的为了解决大家平时判断对象是否为空用 会用 null!=obj 这样的方式存在的判断,从而令人头疼导致NPE(Null Pointer Exception 空指针异常),同时Optional的存在可以让代码更加简单,可读性跟高,代码写起来更高效.
public class OptionalTest {
/**
* Optional对象创建
*/
@Test
public void createOpt(){
//创建一个包装对象为空的Optional对象
Optional<String> optEmpty = Optional.empty();
//创建包装对象值非空的Optional对象
Optional<String> optOf = Optional.of("optional");
//创建包装对象值允许为空也可以不为空的Optional对象
Optional<String> optOfNullable1 = Optional.ofNullable(null);
Optional<String> optOfNullable2 = Optional.ofNullable("optional");
}
/**
* 返回一个optional的实例,用于返回对象的值
*/
@Test
public void optionalGet(){
String str = "hello";
String nullStr = null;
//如果value不为空则做返回,如果为空则抛出异常 "No value present"
System.out.println(Optional.ofNullable(str).get()); //返回 hello
System.out.println(Optional.ofNullable(nullStr).get()); //抛出异常 No value present
}
/**
* 返回一个boolean类型值,如果对象不为空则为true,如果为空则false
*/
@Test
public void isPresent(){
Person person = new Person();
person.setAge(2);
//判空
if(Optional.ofNullable(person).isPresent()){
//不为空的逻辑
System.out.println("person不为空");
}else {
//为空的逻辑
System.out.println("person为空");
}
}
/**
* 判断是否为空并返回函数
*/
@Test
public void ifPresent(){
Person person = new Person();
person.setName("小明");
//如果person不为空,则运行函数体 System.out.println("我的名字是:"+p.getName())
Optional.ofNullable(person).ifPresent(p -> System.out.println("我的名字是:"+p.getName()));
}
/**
* 对象过滤
* 接收一个对象然后进行条件过滤,如果条件符合则返回Optional对象本身,如果不符合则返回空Optional
*/
@Test
public void filter(){
Person person = new Person();
person.setAge(20);
System.out.println(Optional.ofNullable(person).filter(p -> p.getAge() > 50)); //条件不符合返回 Optional.empty
System.out.println(Optional.ofNullable(person).filter(p -> p.getAge() < 50)); //条件符合返回对象 person
}
/**
* 对对象进行二次包装
* 将对应Funcation函数式接口中的对象,进行二次运算,封装成新的对象然后返回在Optional中
*/
@Test
public void map(){
Person person = new Person();
person.setAge(20);
String optName = Optional.ofNullable(person.getAge())
.map(p -> person.getName()).orElse("name为空");
System.out.println(optName); // name为空
}
/**
* 为空返回对象
* 如果包装对象为空的话,则执行orElse方法里的value,如果非空,则返回写入对象
*/
@Test
public void orElse(){
Person person = new Person();
person.setName("蘑菇头");
Person person1 = new Person();
person1.setName("闰土");
Person person2 = new Person();
Person person3 = new Person();
person3.setName("闰土");
//如果存在蘑菇头则返回蘑菇头,不存在则返回闰土
System.out.println(Optional.ofNullable(person.getName()).orElse(person1.getName())); // 蘑菇头
System.out.println(Optional.ofNullable(person2.getName()).orElse(person3.getName()));// 闰土
}
/**
* 为空返回异常
* 如果为空,就抛出自己定义的异常,如果不为空返回当前对象
*/
@Test
public void orElseThrow(){
Member member = memberService.selectByPhone(request.getPhone());
Optional.ofNullable(member).orElseThrow(() -> new ServiceException("没有查询的相关数据"));
}
}
虽然Optional用来判空非常好用,但是读起来却没有 if(obj != null)浅显易懂