告别丑陋判空,一个Optional类就能搞定!
前言
Opitonal类就是Java提供的为了解决大家平时判断对象是否为空用,通常会用 null!=obj 这样的方式存在的判断,从而令人头疼导致空指针异常,同Optional的存在可以让代码更加简单,可读性跟高,代码写起来更高效
演示
package com.hxut.mrs;
import com.hxut.mrs.common.vo.UserInfoVo;
import com.hxut.mrs.entity.SysUser;
import com.hxut.mrs.exception.SystemException;
import com.hxut.mrs.service.SysUserService;
import com.hxut.mrs.utils.BeanCopyUtils;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Supplier;
/**
* description: OptionalTest
* date: 2023/2/23 15:36
* author: MR.孙
*/
@SpringBootTest
public class OptionalTest {
@Test
void test() {
SysUser sysUser = new SysUser();
if (null == sysUser) {
//不会执行
System.out.println("user为空");
}
if (Objects.nonNull(sysUser)) {
//会执行
System.out.println("user为空");
}
}
@Test
void optionalDemo() {
// 1、创建一个包装对象值为空的Optional对象
Optional<Object> empty = Optional.empty();
// 2、创建包装对象值非空的Optional对象
Optional<String> optional = Optional.of("optional");
// 3、创建包装对象值允许为空也可以不为空的Optional对象
Optional<Object> optOfNullable1 = Optional.ofNullable(null);
Optional<Object> optOfNullable2 = Optional.ofNullable("optional");
}
@Test
void OptionGet() {
/**
* Optional.get()方法(返回对象的值)
* get()方法是返回一个option的实例值
*/
SysUser sysUser = new SysUser();
sysUser.setUserId(1L);
System.out.println(Optional.ofNullable(sysUser).get());
}
@Test
void OptionalIsPresent() {
/**
* Optional.isPresent()方法(判读是否为空)
* isPresent()方法就是会返回一个boolean类型值,如果对象不为空则为真,如果为空则false
*/
SysUser sysUser = new SysUser();
sysUser.setUserId(1L);
if (Optional.ofNullable(sysUser).isPresent()) {
System.out.println("不为空");
} else {
System.out.println("为空");
}
}
@Test
void OptionalIfPresent(){
/**
* Optional.ifPresent()方法(判读是否为空并返回函数)
* 这个意思是如果对象非空,则运行函数体
*/
SysUser sysUser = new SysUser();
sysUser.setUserId(1L);
//如果对象不为空,则会打印这个年龄,因为内部已经做了NPE(非空判断),所以就不用担心空指针异常了
Optional.ofNullable(sysUser).ifPresent(s -> System.out.println(s.getUserId()));
}
@Test
void OptionalFilter(){
/**
* Optional.filter()方法(过滤对象)
* filter()方法大致意思是,接受一个对象,然后对他进行条件过滤,
* 如果条件符合则返回Optional对象本身,如果不符合则返回空Optional
*/
SysUser sysUser = new SysUser();
sysUser.setUserId(1L);
Optional<SysUser> optional = Optional.ofNullable(sysUser).filter(s -> s.getUserId() < 0L);
// System.out.println(optional.get());
System.out.println(optional.isPresent());
}
@Test
void OptionalMap(){
/**
* Optional.flatMap()方法(Optional对象进行二次包装)
* map()方法将对应Optional< Funcation >函数式接口中的对象,进行二次运算,封装成新的对象然后返回在Optional中
*/
SysUser sysUser = new SysUser();
sysUser.setUserId(1L);
Optional<String> username = Optional.ofNullable(sysUser).map(s -> Optional.ofNullable(s.getUsername()).orElse("用户名为空"));
System.out.println(username.get());
}
@Test
void OptionalFlatMap(){
/**
* flatMap() :
* 如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装。
* flatMap方法与map方法类似,区别在于mapping函数的返回值不同。map方法的mapping函数返回值可以是任何类型T,而flatMap方法的mapping函数必须是Optional。
*
*/
SysUser sysUser = new SysUser();
sysUser.setUserId(1L);
//map写法
// String s = Optional.ofNullable(sysUser).map(SysUser::getUsername).orElse(null);
String s = Optional.ofNullable(sysUser).flatMap(u -> Optional.ofNullable(u.getUsername())).orElse("");
}
@Test
void OptionalOrElse(){
/**
* Optional.orElse()方法(为空返回对象)
* 常用方法之一,这个方法意思是如果包装对象为空的话,就执行orElse方法里的value,如果非空,则返回写入对象
*/
SysUser sysUser = new SysUser();
sysUser.setUserId(1L);
SysUser sysUser2 = Optional.ofNullable(sysUser).orElse(new SysUser(2L, null, null, null, null, null, null, null, null, null, null, null, null, null, null));
System.out.println(sysUser2);
}
@Test
void OptionalOrElseGet(){
/**
* Optional.orElseGet()方法(为空返回Supplier对象)
* 这个与orElse很相似,入参不一样,入参为Supplier对象,为空返回传入对象的.get()方法,如果非空则返回当前对象
*/
SysUser sysUser = new SysUser();
sysUser.setUserId(1L);
// Supplier<SysUser> user = SysUser::new;
Optional<Supplier<SysUser>> sup = Optional.of(SysUser::new);
System.out.println(Optional.ofNullable(sysUser).orElseGet(sup.get()));
}
@Autowired
SysUserService userService;
@Test
void OptionalOrElseThrows(){
SysUser user = userService.getById(15);
Optional.ofNullable(user).orElseThrow(()->new SystemException(100, "user不能为空"));
}
实战
SysUserService
package com.hxut.mrs.service;
import com.hxut.mrs.entity.SysUser;
import java.util.List;
import java.util.Optional;
public interface SysUserService extends IService<SysUser> {
Optional<SysUser> getUser(Long id);
}
SysUserServiceImpl
@Service
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements SysUserService {
@Override
public Optional<SysUser> getUser(Long id) {
SysUser user = this.getById(id);
return Optional.ofNullable(user);
}
}
/**
* 对某个对象的属性进行判断
*/
@Test
void OptionalExercise1(){
SysUser sysUser = new SysUser();
// sysUser.setUserId(17L);
Optional.ofNullable(sysUser).map(user->Optional.ofNullable(user.getUserId()).orElseThrow(()->new SystemException(500, "没有找到用户")));
}
/**
* sql查询结果进行操作
*/
@Test
void OptionalExercise2(){
Optional<SysUser> user = userService.getUser(1L);
//不为空
if (user.isPresent()) {
//获取user值
SysUser sysUser = user.get();
//拷贝对象
UserInfoVo userInfoVo = BeanCopyUtils.copyBean(sysUser, UserInfoVo.class);
System.out.println(userInfoVo);
return ;
}
throw new SystemException(500, "用户不能为空");
}
/**
* 链式操作
*/
@Test
void OptionalExercise3(){
SysUser sysUser = userService.getById(1L);
Optional.ofNullable(sysUser)
.map(SysUser::getUserId)
.filter(id->id<1L)
.orElseThrow(()->new SystemException(500, "用户id不正确"));
}
}

浙公网安备 33010602011771号