Optional是jdk8的新特性之一
话不多说,接下来演示下如何优雅判空
1.首先确定一个判空对象,这里方便演示,直接用构造方法创建一个对象来演示,就不从数据库中查询了。
@Test
public void test(){
TestUser testUser = new TestUser("zs",18,"北京");
//将需要判空的对象转变为Optional对象
Optional<TestUser> optionalTestUser = Optional.ofNullable(testUser);
//判空
//1.正常情况下判空
if (testUser.getName() != null) {
//执行操作
System.out.println(testUser.getName());
}
//2.使用optional进行链式判空
String name= optionalTestUser.map(TestUser::getName)//使用映射获取姓名属性
.orElse("ls");//如果姓名属性为空,则返回“ls”这个默认值
System.out.println(name);
}
输出结果:
接下来将姓名改为null
可以看到Optional判空时,当判空对象为空时,使用orElse("ls")设定默认返回值为“ls”;
2.当我们需要从数据库中查询用户,当用户不存在时,新建一个用户并返回该如何操作?
使用orElseGet()方法,该方法可以实现短路,当optional对象不存在时,执行lombda中的代码,否则返回optional对象
@Test
public void testOrElseGet(){
TestUser testUser = new TestUser("zs",18,"北京");
//将需要判空的对象转变为Optional对象
Optional<TestUser> optionalTestUser = Optional.ofNullable(testUser);
//3.当我们需要从数据库中查询用户,当用户不存在时,新建一个用户并返回该如何操作
TestUser user = optionalTestUser
//orElseGet()可以实现短路,当判空对象存在则返回,如果不存在则执行后续lombda中方法
.orElseGet(() -> new TestUser("ww", 23, "天津"));
System.out.println(user);
}
执行结果:
将optional对象改为空
@Test
public void testOrElseGet(){
TestUser testUser = new TestUser("zs",18,"北京");
testUser = null;
//将需要判空的对象转变为Optional对象
Optional<TestUser> optionalTestUser = Optional.ofNullable(testUser);
//3.当我们需要从数据库中查询用户,当用户不存在时,新建一个用户并返回该如何操作
TestUser user = optionalTestUser
//orElseGet()可以实现短路,当判空对象存在则返回,如果不存在则执行后续lombda中方法
.orElseGet(() -> new TestUser("ww", 23, "天津"));
System.out.println(user);
}
执行结果:
filter方法
4.当执行一些条件判断操作时,可以使用filter方法进行操作
如:判断用户年龄是否大于30,如果是则打印该用户
代码如下
@Test
public void testFilter(){
TestUser testUser = new TestUser("zs",18,"北京");
//将需要判空的对象转变为Optional对象
Optional<TestUser> optionalTestUser = Optional.ofNullable(testUser);
//3.判断用户年龄是否大于30,如果是则打印该用户
optionalTestUser.map(TestUser::getAge)
.filter(a -> a <30)
.ifPresent(a -> System.out.println(a));
}
执行结果:
将age改为大于30岁
@Test
public void testFilter(){
TestUser testUser = new TestUser("zs",34,"北京");
//将需要判空的对象转变为Optional对象
Optional<TestUser> optionalTestUser = Optional.ofNullable(testUser);
//3.判断用户年龄是否大于30,如果是则打印该用户
optionalTestUser.map(TestUser::getAge)
.filter(a -> a <30)
.ifPresent(a -> System.out.println(a));
}
执行结果:可以看到没有执行后续结果