Java中的Optional
在我们日常的开发中,我们经常会遇到 NullPointerException。如何才能优雅的处理NPE?这里告诉大家一个较为流行的方法
java.util.Optional
使用Optional来修饰对象,表示这个对象可能为null。在使用时,就要加以注意,必须要考虑该值为null的场景。
使用Optional构建对象
        // 创建一个空的car
        Optional<Car> car = Optional.empty();
        // 使用of创建,of的值一定不能是null,否则赋值阶段就报 NullPointerException
        /**
         *  if (obj == null)
         *             throw new NullPointerException();
         */
        Car car1 = new Car();
        Optional<Car> ocar1 = Optional.of(car1);
        // 创建一个可以为null的Optional,该方法支持car为null,但是会在用到car的地方抛出异常,但不是空指针异常。
        Car car2 = new Car();
        Optional<Car> ocar2 = Optional.ofNullable(car2);
        System.out.println(ocar2.get());
        Optional<Car> ocar22 = Optional.ofNullable(null);
获取Optional中的对象
- 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);
- orElse: 作用和get一样,但是没有值时可以使用默认值
 
        /**
         *     public T orElse(T other) {
         *         return value != null ? value : other;
         *     }
         */
        String orName = car.getInsurance().orElse(new Insurance()).getName();
        System.out.println(orName);
- orElseGet: orElse的延时版本。只有当val为空时,才会创建defleat value
 
        /**
         * public T orElseGet(Supplier<? extends T> supplier) {
         *         return value != null ? value : supplier.get();
         *     }
         */
        String getElseName = car.getInsurance().orElseGet(Insurance::new).getName();
        System.out.println("getElseName " + getElseName);
- orElseThrow: 和orElse类似,只是当value不存在时抛出异常
 
    public T orElseThrow() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }
- ifPresent: 判断值存在之后再操作,不存在就不操作
 
        /**
         * public void ifPresent(Consumer<? super T> action) {
         *         if (value != null) {
         *             action.accept(value);
         *         }
         *     }
         */
        car.getInsurance().ifPresent(ins -> {
            String pname = ins.getName();
            System.out.println("inPresent " + pname);
        });
Optional 中map和flatmap的差别
Optional<Optional<Car>> mCar = optionalPerson.map(Person::getCar);
Optional<Car> flatMapCap = optionalPerson.flatMap(Person::getCar);
map
    public <U> Optional<U> map(Function<? super T, ? extends U> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent()) {
            return empty();
        } else {
            //  返回值使用Optional包装
            return Optional.ofNullable(mapper.apply(value));
        }
    }
flatMap
    public <U> Optional<U> flatMap(Function<? super T, ? extends Optional<? extends U>> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent()) {
            return empty();
        } else {
            @SuppressWarnings("unchecked")
            Optional<U> r = (Optional<U>) mapper.apply(value);
            // 返回值没有包装,直接是Optional对象,只做了一次判null
            return Objects.requireNonNull(r);
        }
    }
												
											Java中的Optional的更多相关文章
- map和flatmap的区别+理解、学习与使用 Java 中的 Optional
		
转自:map和flatmap的区别 对于stream, 两者的输入都是stream的每一个元素,map的输出对应一个元素,必然是一个元素(null也是要返回),flatmap是0或者多个元素(为n ...
 - 理解、学习与使用 Java 中的 Optional
		
从 Java 8 引入的一个很有趣的特性是 Optional 类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) -- 每个 Java 程序员都 ...
 - 理解、学习与使用 JAVA 中的 OPTIONAL<转>
		
从 Java 8 引入的一个很有趣的特性是 Optional 类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都 ...
 - 理解、学习与使用 JAVA 中的 Optional【转载】
		
这是一篇转载的文章.刚学java的时候看了好久这个Optional,但一直是懵的.今天又又遇到了,重新回来再看的时候,发现并没有那么难道那个. 转载的文章再开头处写了一个对于理解Optional很关键 ...
 - JAVA 中的Optional (臭名昭著的空指针异常(NullPointerException))
		
从 Java 8 引入的一个很有趣的特性是 Optional 类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) -- 每个 Java 程序员都 ...
 - 理解、学习与使用Java中的Optional
		
从Java8 引入的一个很有趣的特性是Optional类.Optional类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非常了解的异 ...
 - Java中Optional类的使用
		
从 Java 8 引入的一个很有趣的特性是 Optional 类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都 ...
 - Java中的反射和注解
		
前言 在Java中,反射机制和注解机制一直是一个很重要的概念,那么他们其中的原理是怎么样呢,我们不仅仅需要会使用,更要知其然而之所以然. 目录 反射机制 反射如何使用 注解定义 注解机制原理 注解如何 ...
 - java中的tuple实现
		
java中没有类似c#.scala中的tuple元组类,只能自己动手,丰衣足食了,见下面的代码: Tuple 抽象类 import java.util.Optional; /** * Tuple元组类 ...
 
随机推荐
- linux下的nginx日志自动备份压缩--日志切割机
			
部署完毕nginx之后,发现自己的/var/log/nginx/*log的日志不会压缩,一直都是一个文本写日志, 时间久了,日志文件内存过于增加,将会导致在日志添加过程效率降低,延长时间. 默认安装的 ...
 - NC50965 Largest Rectangle in a Histogram
			
NC50965 Largest Rectangle in a Histogram 题目 题目描述 A histogram is a polygon composed of a sequence of ...
 - 隐私计算FATE-多分类神经网络算法测试
			
一.说明 本文分享基于 Fate 使用 横向联邦 神经网络算法 对 多分类 的数据进行 模型训练,并使用该模型对数据进行 多分类预测. 二分类算法:是指待预测的 label 标签的取值只有两种:直白来 ...
 - Throwable类中3个异常处理的方法和finally代码块
			
/* Throwable类中定义了3个异常处理的方法 String getMessage() 返回此 throwable 的简短描述. String toString() 返回此 throwable ...
 - java面试题(2022最新)
			
1.String是基本数据类型么?不是基本数据类型,byte int char long flout duable boolem short 2.int 和integer区别int是基本数据类型,in ...
 - 4-2 Spring MVC框架-01
			
Spring MVC框架-01 Ⅰ.接收客户端请求 1. 关于Spring MVC框架 Spring MVC是基于Spring框架基础之上的 作用: 接收请求,响应结果,处理异常 主要解决了后端服务器 ...
 - ASP.NET Core 6框架揭秘实例演示[29]:搭建文件服务器
			
通过HTTP请求获取的Web资源很多都来源于存储在服务器磁盘上的静态文件.对于ASP.NET应用来说,如果将静态文件存储到约定的目录下,绝大部分文件类型都是可以通过Web的形式对外发布的." ...
 - vscode 个人配置 settings.json
			
{ "workbench.colorTheme": "Default Dark+", "workbench.iconTheme&quo ...
 - iNeuOS工业互联网操作系统,设备运维业务和“低代码”表单开发工具
			
目 录 1. 概述... 2 2. 设备运维业务... 3 3. "低代码"表单开发工具... 6 1. 概述 iNeuOS工业互联网 ...
 - linux学习随笔
			
date +%Y-%m-%d\ %H:%M:%S cal 10 2009 yum install bc //计算器 bc 安装thefuck yum install gcc gcc++ python ...