Optional 使用

Optional 使用

  • Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
  • Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
  • Optional 类的引入很好的解决空指针异常。

创建

 		//参数:value –要描述的值,必须为非null
        Optional<Object> o = Optional.of(null);
        //参数:value –可以为空 也可以不空 返回传入值得optional
        Optional<String> s = Optional.ofNullable("");
        //返回一个空的Optional实例。 此Optional没有值。
        Optional<Object> empty = Optional.empty();

判断

 Optional<MyUser> myUser1 = Optional.empty();
        Optional<MyUser> myUser2 = Optional.of(new MyUser("阿飞", "123456"));

        // filter传入一个lambda,lambda返回值为boolean;true:不做任何改变,false:返回一个空的optional;
        Optional<MyUser> myUser3 = myUser2.filter(user -> "错误的密码".equals(user.getUsername()));

        // isPresent就是判断value是不是null;我们在调用get之前,一定要先调用isPresent,因为直接如果value是null,直接调用get会报异常;
        if (myUser1.isPresent()) {
            MyUser value = myUser1.get();
            System.out.println("optional value:" + value);
        } else {
            System.out.println("optional value==null");
        }
        // ifPresent传入一段lambda,当value!=null时,执行里面的逻辑;当当value==null时,啥都不干;
        myUser2.ifPresent(value -> System.out.println("optional value:" + value));


        System.out.println(myUser3);

        // 输入如下:
        //optional value==null
        //optional value:MyUser{id='阿飞', username='123456'}
        //Optional.empty

获取

  Optional<MyUser> userInfoEmptyOpt = Optional.empty();
        Optional<MyUser> userInfoOpt = Optional.of(new MyUser("阿飞","123456"));

        
        // 1、直接获取,注意如果value==null,会报NoSuchElementException异常
        MyUser userInfo1 = userInfoOpt.get();
        
        // 2、orElse可以传入一个UserInfo类型的对象作为默认值;
        //    当value!=null时,返回value值;当value==null时,返回默认值作为代替;
        MyUser userInfo2 = userInfoEmptyOpt.orElse(new MyUser("阿飞1","123456"));
        
        // 3、orElseGet和orElse不同的是orElseGet可以传入一段lambda表达式;
        // 当value!=null时,返回value值;
        // 当value==null时,使用该lambda返回的对象作为默认值;
        MyUser userInfo3 = userInfoEmptyOpt.orElseGet(() -> new MyUser("阿飞2","123456"));
        
        // 4、orElseThrow可以传入一段lambda表达式,lambda返回一个Exception;当value!=null时,返回value值;当value==null时,抛出该异常;
        MyUser userInfo4 = userInfoOpt.orElseThrow(NullPointerException::new);

        System.out.println(userInfo1);
        System.out.println(userInfo2);
        System.out.println(userInfo3);
        System.out.println(userInfo4);

        // 输出如下:
        // UserInfo(username=阿飞, password=123456)
        // UserInfo(username=阿飞1, password=123456)
        // UserInfo(username=阿飞2, password=123456)
        // UserInfo(username=阿飞, password=123456)

转换类

 Optional<MyUser> userInfoOpt = Optional.of(new MyUser("阿飞","123456"));

        // 原来value的类型是UserInfo,经过map转换为Optional<String>
        Optional<String> username = userInfoOpt.map(MyUser::getId);

        // 当map的入参也是一个Optional时,经过map转化后会形成Optional<Optional<String>>这种嵌套结构;但flatMap可以把这种嵌套结构打平;
        Optional<Optional<String>> unFlatMap = userInfoOpt.map(user -> Optional.of(user.getId()));
        Optional<String> flatMap = userInfoOpt.flatMap(user -> Optional.of(user.getId()));

        System.out.println(username);
        System.out.println(unFlatMap);
        System.out.println(flatMap);

        // 输出如下:
        // Optional[阿飞]
        // Optional[Optional[阿飞]]
        // Optional[阿飞]


方法描述
empty返回一个空的Optional实例
of将指定用Optional封装之后返回,如果该值为null,则抛出一个NullPointerException异常
ofNullable将指定值用Optional封装之后返回,如果该值为null,则返回一个空的Optional对象
filter如果值存在并且满足提供的谓词,就返回包含该值的Optional对象;否则返回一个空的Optional对象
flatMap如果值存在,就对该值执行提供的mapping函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象
map如果值存在,就对该值执行提供的mapping函数调用
isPresent如果值存在就返回true,否则返回false
ifPresent如果值存在,就执行使用该值的方法调用,否则什么也不做
get如果值存在,就将被Optional封装的值返回,否则抛出一个NoSuchElementException异常
orElse如果有值则将其返回,否则返回一个默认值
orElseGet如果有值则将其返回,否则返回一个由指定的Supplier接口生成的值
orElseThrow如果有值则将其返回,否则抛出一个由指定的Supplier接口生成的异常
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值