深入学习Java8中的Optional

1,179 阅读3分钟

什么是Optional

Optional是java8中引入的一个包含或者不包含一个非空对象的容器对象

Optional有哪些方法?

方法 返回值 说明
of(T) Optional<T> 创建一个Optional对象,如果是空,则抛出NullPointerException()
ofNullable(T) Optional<T> 创建一个Opthonal对象,如果是空,则返回空Optional
get() T 获取Optional中的值,如果是空则抛出NoSuchElementException
isPresent() boolean 判断对象是否是空
ifPresent(Consumer<? super T>) void 如果存在则执行Consumer
map(Function<? super T, ? extends U>) Optional<U> 将一个值映射到另外一个值
flatMap(Function<? super T, Optional<U>>) Optional<U> 将一个值映射到另外一个值
orElse(T) T 当数据不存在时返回T
orElseGet(Supplier<? extends T>) T 当数据不存在时获取supplier中的值
orElseThrow(Supplier<? extends X>) T 当数据不存在的时候抛出异常
filter(Predicate<? super T>) Optional<T> Optional中的值如果存在,则执行过滤逻辑,如果断言返回的值是true则,返回包含该值得Optional对象,否则返回包含空值的Optional对象

of(T)ofNullable(T)方法

两者区别,ofNullable可以传nullof方法不能传null

  • 使用of方法传null
@Test
    public void testOptionalNull() {
        Optional<Object> objectOptional = Optional.of(null);
    }

当使用of方法包装空对象时会抛出NullPointException

get()方法

  • 使用Optional包装非空对象,调用get方法
    private User user;

    @BeforeEach
    public void createUser() {
        user = User.builder().id(1L)
                .name("user1")
                .build();
    }

    @Test
    public void testOptionalOf() {
        Optional<User> userOptional = Optional.of(this.user);
        User user = userOptional.get();
        System.out.println("get:" + user);
    }

执行结果:

  • 使用Optional包装空对象,调用get方法
@Test
public void testOptional() {
    Optional<User> emptyObj = Optional.empty();
    User user = emptyObj.get();
    System.out.println(user);
}

执行结果,会抛出NoSuchElementException

isPresent()方法


    private User user;

    @BeforeEach
    public void createUser() {
        user = User.builder().id(1L)
                .name("user1")
                .build();
    }
    
    @Test
    public void testOptionalIsPresent() {
        Optional<User> userOptional = Optional.ofNullable(this.user);
        System.out.println("user isPresent:" + userOptional.isPresent());

        System.out.println("=============");

        Optional<Object> emptyOptional = Optional.ofNullable(null);
        System.out.println("Empty isPresent:" + emptyOptional.isPresent());
    }

执行结果:

ifPresent(Consumer<? super T>)方法

    private User user;

    @BeforeEach
    public void createUser() {
        user = User.builder().id(1L)
                .name("user1")
                .build();
    }
    
    @Test
    public void testOptionalIfPresent() {
        Optional<User> userOptional = Optional.ofNullable(this.user);

        userOptional.ifPresent(user -> System.out.println("Optional value存在:" + user));

        System.out.println("=============");

        Optional<Object> emptyOptional = Optional.ofNullable(null);
        emptyOptional.ifPresent(obj -> System.out.println("Optional value存在:" + obj));
    }

执行结果:

map(Function<? super T, ? extends U>)方法


    private User user;

    @BeforeEach
    public void createUser() {
        user = User.builder().id(1L)
                .name("user1")
                .build();
    }
    
    @Test
    public void testOptionalMap() {
        String name = Optional.of(user).map(User::getName).get();
        log.info("name:{}", name);
    }

执行的结果:

orElse(T)orElseGet(Supplier<? extends T>)的区别

    
    private User user;

    @BeforeEach
    public void createUser() {
        user = User.builder().id(1L)
                .name("user1")
                .build();
    }
    
    @Test
    public void testOptionalOrElse() {
        User user = Optional.of(this.user).orElse(this.createNewUser(10L));
        System.out.println("or else user:" + user);
        User user1 = Optional.of(this.user).orElseGet(() -> this.createNewUser(10L));
        System.out.println("or else get user:" + user1);

        System.out.println("===================");
        User user2 = Optional.<User>empty().orElse(this.createNewUser(10L));
        System.out.println("empty or else user:" + user2);
        User user3 = Optional.<User>empty().orElseGet(() -> this.createNewUser(10L));
        System.out.println("empty or else get user:" + user3);

    }

    private User createNewUser(Long id) {
        System.out.println("Create new user!");
        return User.builder()
                .id(id)
                .name("user" + id)
                .build();
    }

执行结果:

Optional包含的对象都是空时,orElseorElseGet方法都会返回参数中获取到的对象,区别是当Optional包含的对象不为空时,orElseGetcreateNewUser懒加载

orElseThrow(Supplier<? extends X>)方法

    @Test
    public void testOptionalOrElseThrow() {
        User user = null;
        Object o = Optional.ofNullable(user).orElseThrow(IllegalArgumentException::new);
    }

执行的结果:

filter(Predicate<? super T>)方法

    @Test
    public void testOptionalFilter() {
        Optional<User> userOptional = Optional.of(this.user);
        Optional<User> filterOptional = userOptional.filter(user -> user.getName() != null && user.getName().contains("1"));
        User user = filterOptional.get();
        System.out.println("filter存在的结果:" + user);
        System.out.println("==============");

        Optional<User> emptyOptional = Optional.empty();
        Optional<User> filterEmptyOptional = emptyOptional.filter(emptyUser -> emptyUser.getName() != null && emptyUser.getName().contains("1"));
        User emptyUser = filterEmptyOptional.get();
        System.out.println("empty filter存在的结果:" + emptyUser);

    }

执行结果: