使用Optional做非空判断

简单来说,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)浅显易懂

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值