java-Optional 类详解

目录

前言

Optional的构造方法

Optional的相关方法介绍

isPresent用法:

get用法:

filter用法:

 orElse用法:

 orElseGet用法

orElseThrow用法

map用法

flatMap用法:


前言

Optional 类是java8的新特性,是一个可以为null的容器对象。它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测,很好的解决空指针异常。

Optional的构造方法

1.为value创建一个Optional对象,如果value为空则会报出NullPointerException异常
Optional.of(T value)
2.为value创建一个Optional对象,但允许value为null值。如果传入的值为 null 的话,返回的就是Optional.empty()
Optional.ofNullable(T value)
3.该方法用来构造一个空的 Optional,即该 Optional 中不包含值,其实底层实现还是 如果 Optional 中的 value 为 null 则该 Optional 为不包含值的状态,然后在 API 层面将 Optional 表现的不能包含 null 值,使得 Optional 只存在 包含值 和 不包含值 两种状态。
Optional.empty()

Optional的相关方法介绍

isPresent用法:

1)判断当前value是否为null,如果不为null则返回true,否则false。

2)如果不为null值就执行函数式接口的内容

 用法示例:

    @Test
    public void TestOptional(){
        UserDto userDto = new UserDto();
        userDto.setName("high");
        Optional<UserDto> user = Optional.ofNullable(userDto);
        user.ifPresent(n-> System.out.println("userdto name is "+ n.getName()));
    }
get用法:

返回当前的值,如果为空则报异常。

filter用法:

filter 方法接受一个 Predicate 来对 Optional 中包含的值进行过滤,如果包含的值满足条件,那么还是返回这个 Optional;否则返回 Optional.empty。

 用法示例:

    @Test
    public void TestOptional(){
        UserDto userDto = new UserDto();
        userDto.setId(1L).setName("high1").setAge(18);
        Optional<String> name = Optional.ofNullable(userDto)
                .filter(user -> user.getAge() > 19)
                .map(user -> user.getName());
        System.out.println("name is"+name.orElse("空值"));

    }
 orElse用法:

如果 Optional 中有值则将其返回,否则返回 orElse 方法传入的参数。

示例:

    @Test
    public void TestOptional(){
        UserDto userDto = null;
        UserDto userDto1 = Optional.ofNullable(userDto)
                .orElse(new UserDto().setId(1L).setName("high").setAge(18));
        System.out.println(userDto1);
    }
 orElseGet用法

orElseGet和orElse类似,只是orElseGet支持函数式接口来生成other值。

 

 用法示例:

    @Test
    public void TestOptional(){
        UserDto userDto = null;
        UserDto userDto1 = Optional.ofNullable(userDto)
                .orElseGet(()->new UserDto().setId(1L).setName("high").setAge(18));
        System.out.println(userDto1);
    }
orElseThrow用法

如果有值则返回,没有则用函数式接口抛出生成的异常。

 

用法示例:

    @Test
    public void TestOptional(){
        UserDto userDto = null;
        UserDto userDto1 = Optional.ofNullable(userDto)
                .orElseThrow(()->new RuntimeException("没有该用户"));
        System.out.println(userDto1);
    }
map用法

如果当前 Optional 为 Optional.empty,则依旧返回 Optional.empty;否则返回一个新的 Optional,该 Optional 包含的是:函数 mapper 在以 value 作为输入时的输出值。

用法示例:

    @Test
    public void TestOptional(){
        UserDto userDto = new UserDto();
        userDto.setId(1L).setName("high1").setAge(18);
        Optional<String> name = Optional.ofNullable(userDto)
                .map(user->user.setName(" high1.1"))
                .map(UserDto::getName)
                .map(String::toUpperCase);
        System.out.println("name is"+name.orElse("空值"));
    }
flatMap用法:

与map用法差不多,区别在于 flatMap 要求参数中的函数 mapper 输出的就是 Optional。

 用法:

    @Test
    public void TestOptional(){
        UserDto userDto = new UserDto();
        userDto.setId(1L).setName("high1").setAge(18);
        Optional<String> name = Optional.ofNullable(userDto)
                .flatMap(user->Optional.of(user.setName(" high1.1")))
                .flatMap(user->Optional.of(user.getName()))
                .flatMap(user->Optional.of(user.toUpperCase()));
        System.out.println("name is"+name.orElse("空值"));
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值