Java中的Optional使用详细说明

 更新时间:2023年11月08日 09:51:47   作者:你就像甜甜的益达  
这篇文章主要介绍了Java中的Optional使用详细说明,Optional就是相当于把对象包了一层,将判断空的部分代码给单独抽出来了,主要就是为了避免null引起的部分问题,需要的朋友可以参考下

简介

java.util.Optional java1.8 官方描述:

(这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。)

个人理解: Optional就是相当于把对象包了一层,将判断空的部分代码给单独抽出来了,主要就是为了避免null引起的部分问题.

Optional的使用

首先看看Optional的方法:

在这里插入图片描述

三个静态方法

  • Optional.empty()

返回一个空的Optional,用的不多;主要就是为了使Optional只存在有值和无值的情况,不存在包含null的情况,在后面的ofNullable方法中使用;

  • Optional.of(T value)
 
   public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }
    
   private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }

   public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }

传入一个非null的value值,返回一个包含value的Option;如果为null会抛出空指针异常;

  • Optional.ofNullable(T value)(用的最多)
    public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }

传入一个非null的value值,返回一个包含value的Option;

传入一个value值,返回一个包含value的Option;可以为null,如果为null则返回一个空的Optional,就是Optional.empty(),可以看看源码

方法介绍

Optional一般链式调用,方法也比较简单

  • get()
    • 如果该值存在,将该值直接返回,否则抛出一个 NoSuchElementException 异常。
  • isPresent()
    • 返回该值是否存在的布尔值,存在true不存在false;
  • isPresent(Consumer<? super T> consumer)
    • 没有返回值,传入的是一个函数,如果存在执行函数,不存在则不执行
  • filter(Predicate<? super T> predicate)
    • filter 方法接受一个 Predicate 来对 Optional 中包含的值进行过滤,如果包含的值满足条件,那么还是返回这个 Optional;否则返回 Optional.empty。
  • map(Function<? super T, ? extends U> mapper)
    • 对该值执行提供的 get方法调用。
  • flatMap(Function<? super T, Optional> mapper)
    • 同上,只不过Function返回的时候就是Optional;而map是代码里面帮忙封装了.
    public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent())
            return empty();
        else {
            return Optional.ofNullable(mapper.apply(value));
        }
    }

  public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent())
            return empty();
        else {
            return Objects.requireNonNull(mapper.apply(value));
        }
    }

  • orElse(T other)

如果调用对象包含值,返回该值,否则返回t。

  • orElseGet(Supplier<? extends T> other)

如果调用对象包含值,返回该值,否则返回 other 获取的值。

  • orElseThrow(Supplier<? extends X> exceptionSupplier)

如果调用对象包含值,返回该值,否则抛出 other 获取的异常。

使用案例

  • 判断对象是否存在,如果存在则执行操作
    @Test
    public void test1() {
        User user = null;
        User retUser = new User();
        retUser.setName("aaa");
        retUser.setAge(33);
        Optional.ofNullable(retUser).ifPresent(x->{
            System.out.println(x.getName());
            System.out.println(x.getAge());
        });
    }
  • 判断对象是否为空,如果为空则返回默认值
   @Test
    public void test2() {
//        User user = new User();
        User user = null;
        User retUser = new User();
        retUser.setName("aaa");
        retUser.setAge(33);
        
        User user1 = Optional.ofNullable(user).orElse(retUser);
        System.out.println(user1);
    }
  • 对对象的某一属性获取,如果为空则获取默认的,好比返回用户头像地址,如果没有设置则返回一个默认的头像地址,如果有则添加地址返回;
 @Test
    public void test3() {
        User user = null;
        User retUser = new User();
        retUser.setName("aaa");
        retUser.setAge(33);

        String lowerName = Optional.ofNullable(user).map(u -> {
            return u.getName();
        }).map(name -> {
            return name.toLowerCase();
        }).orElse("默认的名字");

        System.out.println(lowerName);
    }

代码

import lombok.Data;
import lombok.ToString;
import org.junit.Test;
import java.util.Optional;
public class OptionalTest {
    public static void main(String[] args) {
        User user = new User();
        user.setName("yida");
        user.setAge(18);
        Optional<Object> empty = Optional.empty();
        Optional<User> user1 = Optional.of(user);
        Optional<User> user2 = Optional.ofNullable(user);
    }
    @Test
    public void test1() {
        User user = null;
        User retUser = new User();
        retUser.setName("aaa");
        retUser.setAge(33);
        Optional.ofNullable(retUser).ifPresent(x->{
            System.out.println(x.getName());
            System.out.println(x.getAge());
        });
    }
    @Test
    public void test2() {
        User user = null;
        User retUser = new User();
        retUser.setName("aaa");
        retUser.setAge(33);
        User user1 = Optional.ofNullable(user).orElse(retUser);
        System.out.println(user1);
    }
    @Test
    public void test3() {
        User user = null;
        User retUser = new User();
        retUser.setName("aaa");
        retUser.setAge(33);
        String lowerName = Optional.ofNullable(user).map(u -> {
            return u.getName();
        }).map(name -> {
            return name.toLowerCase();
        }).orElse("默认的名字");
        System.out.println(lowerName);
    }
    @Data
    @ToString
    private static class User{
        private String name;
        private Integer age;
    }
}

到此这篇关于Java中的Optional使用详细说明的文章就介绍到这了,更多相关Java中的Optional内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 熟练掌握Java8新特性之Stream API的全面应用

    熟练掌握Java8新特性之Stream API的全面应用

    Stream是Java8的一大亮点,是对容器对象功能的增强,它专注于对容器对象进行各种非常便利、高效的 聚合操作(aggregate operation)或者大批量数据操作。Stream API借助于同样新出现的Lambda表达式,极大的提高编程效率和程序可读性,感兴趣的朋友快来看看吧
    2021-11-11
  • Spring Security自定义失败处理器问题

    Spring Security自定义失败处理器问题

    这篇文章主要介绍了Spring Security自定义失败处理器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 探索jedis连接池预热优化高并发

    探索jedis连接池预热优化高并发

    这篇文章主要为大家介绍了jedis连接池预热优化高并发深入探索示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Java8通过Function获取字段名的方法(获取实体类的字段名称)

    Java8通过Function获取字段名的方法(获取实体类的字段名称)

    Java8通过Function获取字段名。不用再硬编码,效果类似于mybatis-plus的LambdaQueryWrapper,对Java8通过Function获取字段名相关知识感兴趣的朋友一起看看吧
    2021-09-09
  • SpringBoot使用mybatis-plus分页查询无效的问题解决

    SpringBoot使用mybatis-plus分页查询无效的问题解决

    MyBatis-Plus提供了很多便捷的功能,包括分页查询,本文主要介绍了SpringBoot使用mybatis-plus分页查询无效的问题解决,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • java 反射 动态调用不同类的静态方法(推荐)

    java 反射 动态调用不同类的静态方法(推荐)

    下面小编就为大家带来一篇JAVA 反射 动态调用不同类的静态方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • Java基础知识之BufferedReader流的使用

    Java基础知识之BufferedReader流的使用

    这篇文章主要介绍了Java基础知识之BufferedReader流的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringBoot下RabbitMq实现定时任务

    SpringBoot下RabbitMq实现定时任务

    这篇文章主要为大家详细介绍了SpringBoot下RabbitMq实现定时任务,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • java实习--每天打卡十道面试题!

    java实习--每天打卡十道面试题!

    临近秋招,备战暑期实习,祝大家每天进步亿点点!本篇文章准备了十道java的常用面试题,希望能够给大家提供帮助,最后祝大家面试成功,进入自己心仪的大厂
    2021-06-06
  • Java Springboot websocket使用案例详解

    Java Springboot websocket使用案例详解

    这篇文章主要介绍了Java Springboot websocket使用案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09

最新评论