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。

java-Optional 类详解_第1张图片

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

java-Optional 类详解_第2张图片

 用法示例:

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

get用法:

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

java-Optional 类详解_第3张图片

filter用法:

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

java-Optional 类详解_第4张图片

 用法示例:

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

    }

 orElse用法:

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

java-Optional 类详解_第5张图片

示例:

    @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值。

 java-Optional 类详解_第6张图片

 用法示例:

    @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用法

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

java-Optional 类详解_第7张图片

 

用法示例:

    @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 作为输入时的输出值。

java-Optional 类详解_第8张图片

用法示例:

    @Test
    public void TestOptional(){
        UserDto userDto = new UserDto();
        userDto.setId(1L).setName("high1").setAge(18);
        Optional 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。

java-Optional 类详解_第9张图片

 用法:

    @Test
    public void TestOptional(){
        UserDto userDto = new UserDto();
        userDto.setId(1L).setName("high1").setAge(18);
        Optional 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("空值"));
    }

你可能感兴趣的:(java,开发语言)