Java中的Optional

在我们日常的开发中,我们经常会遇到 NullPointerException。如何才能优雅的处理NPE?这里告诉大家一个较为流行的方法

java.util.Optional

使用Optional来修饰对象,表示这个对象可能为null。在使用时,就要加以注意,必须要考虑该值为null的场景。

使用Optional构建对象

        // 创建一个空的car
        Optional car = Optional.empty();

        // 使用of创建,of的值一定不能是null,否则赋值阶段就报 NullPointerException
        /**
         *  if (obj == null)
         *             throw new NullPointerException();
         */
        Car car1 = new Car();
        Optional ocar1 = Optional.of(car1);

        // 创建一个可以为null的Optional,该方法支持car为null,但是会在用到car的地方抛出异常,但不是空指针异常。
        Car car2 = new Car();
        Optional ocar2 = Optional.ofNullable(car2);
        System.out.println(ocar2.get());
        Optional ocar22 = Optional.ofNullable(null);

获取Optional中的对象

  1. get: 这是最不安全的方法。如果变量存在就返回,不存在的话则会抛出NoSuchElementException的异常。所以,get()的使用场景一定是十分确定Optional修饰的值一定是有内容的,否则不建议使用。
        /**
         * public T get() {
         *         if (value == null) {
         *             throw new NoSuchElementException("No value present");
         *         }
         *         return value;
         *     }
         */
        String name = car.getInsurance().get().getName();
        System.out.println(name);
  1. orElse: 作用和get一样,但是没有值时可以使用默认值
        /**
         *     public T orElse(T other) {
         *         return value != null ? value : other;
         *     }
         */
        String orName = car.getInsurance().orElse(new Insurance()).getName();
        System.out.println(orName);
  1. orElseGet: orElse的延时版本。只有当val为空时,才会创建defleat value
        /**
         * public T orElseGet(Supplier supplier) {
         *         return value != null ? value : supplier.get();
         *     }
         */
        String getElseName = car.getInsurance().orElseGet(Insurance::new).getName();
        System.out.println("getElseName " + getElseName);
  1. orElseThrow: 和orElse类似,只是当value不存在时抛出异常
    public T orElseThrow() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }
  1. ifPresent: 判断值存在之后再操作,不存在就不操作
        /**
         * public void ifPresent(Consumer action) {
         *         if (value != null) {
         *             action.accept(value);
         *         }
         *     }
         */
        car.getInsurance().ifPresent(ins -> {
            String pname = ins.getName();
            System.out.println("inPresent " + pname);
        });

Optional 中map和flatmap的差别

Optional> mCar = optionalPerson.map(Person::getCar);
Optional flatMapCap = optionalPerson.flatMap(Person::getCar);

map

    public  Optional map(Function mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent()) {
            return empty();
        } else {
            //  返回值使用Optional包装
            return Optional.ofNullable(mapper.apply(value));
        }
    }

flatMap

    public  Optional flatMap(Function> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent()) {
            return empty();
        } else {
            @SuppressWarnings("unchecked")
            Optional r = (Optional) mapper.apply(value);
            // 返回值没有包装,直接是Optional对象,只做了一次判null
            return Objects.requireNonNull(r);
        }
    }

Original: https://www.cnblogs.com/hardyzhou/p/16709201.html
Author: hardyzhou
Title: Java中的Optional

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585120/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • JavaScript

    什么是JavaScript 一、概述 JavaScript是一门世界上最流行的脚本语言 一个合格的后端人员,必须要精通JavaScript 快速入门 一、引入JavaScript …

    Java 2023年6月6日
    0125
  • 7.RPC

    posted @2022-08-03 19:36 努力的达子 阅读(9 ) 评论() 编辑 Original: https://www.cnblogs.com/wmd-l/p/16…

    Java 2023年6月5日
    088
  • 《算法很美》视频笔记

    网址: 《算法很美》视频 数据结构可视化 《算法很美》 《算法很美》 第一章 位运算 位运算基础 题解 P1:找出唯一成对的数 问题描述: 思路分析: 代码实现: 问题思考: P2…

    Java 2023年6月16日
    061
  • 记一次 .NET 某新能源系统 线程疯涨 分析

    一:背景 1. 讲故事 前段时间收到一个朋友的求助,说他的程序线程数疯涨,寻求如何解决。 等我分析完之后,我觉得这个问题很有代表性,所以拿出来和大家分享下,还是上老工具 WinDb…

    Java 2023年5月30日
    074
  • springboot竟然有5种默认的加载路径,你未必都知道

    上次分享了如何一步一步搭建一个springboot的项目,详细参见《5分钟快速搭建一个springboot的项目》,最终的结果是在”8080″端口搭建起了服…

    Java 2023年6月9日
    090
  • 优雅的代码从现在开始

    个人见解: 写代码前 构思明白, 想明白,想全 写着写着都是在写相同的代码,改动麻烦 看到不好的就立马让他优雅 学习别人是如何优雅的 便于维护,避免重复代码,便于开发 提取公共函数…

    Java 2023年6月14日
    080
  • Jquery——-获取网页参数

    作者:风清扬 No.1 出处: 如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的 按钮。 如果,您希望更容易地发现我的新博客,不妨点击一下右下角的 因为,我的写作热情也离…

    Java 2023年6月7日
    078
  • springboot nginx 配置

    安装nginx参考本人另一篇博客:http://www.cnblogs.com/gmq-sh/p/5750833.html spring-boot需要启动nginx的,用于监听启动…

    Java 2023年5月30日
    068
  • org.springframework.web.util.WebUtils.isSameOrigin(WebUtils.java:816)

    Nginx反向代理WebSocket时报这个错,普通的http请求没问题,ws请求报错 可能原因: 1、你用了4.2.5.RELEASE版本或者4.2.6.RELEASE,升级到4…

    Java 2023年5月29日
    080
  • nginx实现虚拟主机

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/chrdai/p/11324388.htmlAuthor…

    Java 2023年5月30日
    082
  • Java如何对一个对象进行深拷贝?

    深拷贝实现代码:https://github.com/wudashan/java-deep-copy 深拷贝实现代码:https://github.com/wudashan/jav…

    Java 2023年5月29日
    087
  • 2022年最新动力节点Java自学全套视频资源

    今天整理了java开发的学习路线和相关的学习视频资源,非常适合零基础入门java的小伙伴,希望大家在学习的时候,能够节省时间。 【B站排名第一的】Java零基础视频844集(适合J…

    Java 2023年6月9日
    098
  • 驼峰命名法

    驼峰命名法:单词首字母大写 所有变量名、方法名、类名都要求:见名知意 类名:AnimalDog 首字母大写然后驼峰命名规范:Animal Dog 单词首字母大写 类成员变量:首字母…

    Java 2023年6月6日
    0205
  • redis 基于SpringBoot Reids 的工具类

    redis 基于SpringBoot Reids 的工具类 package com.mhy.springredis.utils; import org.springframewor…

    Java 2023年6月16日
    081
  • 1.2 w字+!Java IO 基础知识系统总结 | JavaGuide

    首发于:JavaGuide(「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。)原文地址:https://javaguide.cn/java/io/i…

    Java 2023年6月9日
    083
  • AQS源码阅读

    AQS-获取资源: AQS-释放资源: posted @2022-06-22 17:07 無名之徒 阅读(9 ) 评论() 编辑 Original: https://www.cnb…

    Java 2023年6月13日
    081
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球