专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

深入学习Java8中的Optional

什么是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

79_1.png

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);
    }

执行结果:

79_2.png

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

执行结果,会抛出NoSuchElementException

79_3.png

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()); }

执行结果:

79_4.png

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));
    }

执行结果:

79_5.png

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); }

执行的结果:

79_6.png

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(); }

执行结果:

79_7.png

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

orElseThrow(Supplier<? extends X>)方法

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

执行的结果:

79_8.png

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);

    }

执行结果:

79_9.png

文章永久链接:https://tech.souyunku.com/26521

未经允许不得转载:搜云库技术团队 » 深入学习Java8中的Optional

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们