告别丑陋判空,一个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不正确"));
    }


}
posted @ 2023-02-23 19:36  长情c  阅读(100)  评论(0)    收藏  举报