java8新特性(三)_Optional类的使用

简介: 说实话,我第一次知道这个东西是从阿里规约中,因为公司前一段时间一直在搞代码审核,我的代码写的就感觉很烂,就像规范下。让别人看起来没那么烂。于是就开始看阿里规约,在看到NPE处理的时候,上面提到用Optional类进行处理。

说实话,我第一次知道这个东西是从阿里规约中,因为公司前一段时间一直在搞代码审核,我的代码写的就感觉很烂,就像规范下。让别人看起来没那么烂。于是就开始看阿里规约,在看到NPE处理的时候,上面提到用Optional类进行处理。这就是我第一次知道这个东东。

Optional简介

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

  • Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

  • Optional 类的引入很好的解决空指针异常。

Optional源码查看

这里建议大家自行阅读其完整源码,这里只分析filter 和 map 方法

类的属性和方法

img_8ace162a66409a9894315fdc0517dd3b.png

从图中我们可以看出,它的构造方法都是private修饰的。其实是一个单例模式的应用。

filter 方法

该方法是过滤方法,过滤符合条件的Optional对象,这里的条件用Lambda表达式来定义。

    public Optional<T> filter(Predicate<? super T> predicate) {
        //如果入参predicate对象为null将抛NullPointerException异常
        Objects.requireNonNull(predicate);
        //如果Optional对象的值为null,将直接返回该Optional对象
        if (!isPresent())
            return this;
        //如果Optional对象的值符合限定条件(Lambda表达式来定义),返回该值,否则返回空的Optional对象
        else
            return predicate.test(value) ? this : empty();
    }

map方法

map方法用于修改该值,并返回修改后的Optional对象,一般会在多级取值的时候用到

    public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
        //如果入参mapper对象为null将抛NullPointerException异常
        Objects.requireNonNull(mapper);
        //如果Optional对象的值为null,将直接返回该Optional对象
        if (!isPresent())
            return empty();
        //执行传入的lambda表达式,并返回经lambda表达式操作后的Optional对象
        else {
            return Optional.ofNullable(mapper.apply(value));
        }
    }

实战演练

判断不为null然后进行操作

     /**
     * 不为null时进行操作
     *
     * @param name
     */
    public static void doThing(String name) {
        if (name != null) {
            System.out.println(name);
        }
    }

    public static void doThingOptional(String name) {
        Optional.ofNullable(name)
                .ifPresent(System.out::println);
    }

多层级取值

    /**
     * 多级取值
     *
     * @param user
     * @return
     */
    public static String getAddress(UserEntity user) {
        if (user != null) {
            AddressEntity addressEntity = user.getAddressEntity();
            if (addressEntity != null) {
                String address = addressEntity.getAddress();
                if (address != null && address.length() > 3) {
                    return address;
                }

            }
        }

        return null;
    }

    public static String getAddressOptional(UserEntity user) {
        return Optional.ofNullable(user)
                .map(u -> u.getAddressEntity())
                .map(a -> a.getAddress())
                .filter(s -> s.length() > 3)
                .orElse(null);
    }

好了,玩的开心.

学习不是要么0分,要么100分的。80分是收获;60分是收获;20分也是收获。有收获最重要。但是因为着眼于自己的不完美,最终放弃了,那就是彻底的0分了。
相关文章
|
7天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
34 17
|
2天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
26 4
|
3天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
11 2
|
7天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
11天前
|
存储 Java 编译器
java wrapper是什么类
【10月更文挑战第16天】
19 3
|
Java 测试技术 API
学习Java8中Optional
Optional 类主要是为了解决(NullPointerException)空指针异常 。本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。但是 Optional 的意义显然不止于此。
310 0
学习Java8中Optional
|
12天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
91 38
|
9天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
4天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####