1: 概论

Optional 是Java8用来改变java引发NPE的解决办法,但是不是绝对的解决办法

2: 例子:

很多博文一上来就给力以下使用例子

 @Data
public class User {
private String name;
private Integer age;
private Optional<Address> address = Optional.empty();
} @Data
public class Address {
private Optional<Street> street = Optional.empty();
} @Data
public class Street {
private String streetName;
private Integer streetNo;
}

然后使用Optional 进行链式调用

1 public String getUserSteetName(User user) {
2
3 Optional<User> userOptional = Optional.ofNullable(user);
4 final String streetName = userOptional.orElse(new User()).getAddress().orElse(new Address()).getStreet().orElse(new Street()).getStreetName();
5 return StringUtils.isEmpty(streetName) ? "nothing found" : streetName;
6 }

下面我们对这个类进行序列化与反序列化:

           ByteArrayOutputStream bos = new ByteArrayOutputStream();//序列化常规代码
ObjectOutputStream obr = new ObjectOutputStream(bos);
obr.writeObject(user); ByteArrayInputStream inputStream = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream inputStream2 = new ObjectInputStream(inputStream);
User user = (Address) inputStream2.readObject();
System.out.println(address2.getStreet().get().getStreetName());

抛出: Exception in thread "main" java.io.NotSerializableException: java.util.Optional 异常, 说明我们不能这样用,Optional 不支持Optional

并且也没有实现相关的序列化接口

public final class Optional<T> {
/**
* Common instance for {@code empty()}.

3:总结

这说明了一个问题:

  • Java 8 提供大Optional 并不能支持序列化
  • 解决NPE,可以考虑在具体的业务逻辑中 使用Optional类提供相关的解决办法 比如Optional.of() 方法
  • Optional一方面的出现,主要还是配合Stream流,比如 reduce() findAny() findFirst()方法提供了返回Optional的操作接口

在实体类 千万不能使用Optional处理NPE,具体的处理逻辑在业务中处理,并且最好完整定义JOPO,不能嵌入无关逻辑,

另一篇文章 : https://www.cnblogs.com/dgwblog/p/11759665.html

序列化禁止使用Optional的更多相关文章

  1. Protobuf在Python中的应用(序列化数据)

    1.了解Protobuf Protocol Buffer是Google的语言中立的,平台中立的,可扩展机制的,用于序列化结构化数据 - 对比XML,但更小,更快,更简单.您可以定义数据的结构化,然后可 ...

  2. Protobuf的简单介绍、使用和分析

      Protobuf的简单介绍.使用和分析   一.protobuf是什么? protobuf(Google Protocol Buffers)是Google提供一个具有高效的协议数据交换格式工具库( ...

  3. Java 8 新特性:6-Optional类

    (原) 先看看上面的说明: /** * A container object which may or may not contain a non-null value. * If a value i ...

  4. Thrift学习笔记—IDL基本类型

    thrift 采用IDL(Interface Definition Language)来定义通用的服务接口,并通过生成不同的语言代理实现来达到跨语言.平台的功能.在thrift的IDL中可以定义以下一 ...

  5. IDL语言开发规范

    一.支持的类型 1.IDL支持常见的基本类型,常量,枚举,容器,结构体,服务.不支持多态和重载,参数.返回值不能为空,各个基本类型的标识如下: bool:对应java的boolean,布尔类型(tru ...

  6. 【传输协议】thrift的IDL语法

    一.IDL Thrift 采用IDL(Interface Definition Language)来定义通用的服务接口,然后通过Thrift提供的编译器,可以将服务接口编译成不同语言编写的代码,通过这 ...

  7. Thrift IDL基本语法

    简言:介绍Thrift的IDL基本语法,初次使用或多或少的会有很有"坑"要踩,但是我们要遇山挖山,遇海填海,在学习的道路上坚定的走下去,方可日后吹牛B! IDL Thrift 采用 ...

  8. jackson学习之五:JsonInclude注解

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. thrift的介绍及其使用

    什么是thrift Thrift是Facebook于2007年开发的跨语言的rpc服框架,提供多语言的编译功能,并提供多种服务器工作模式:用户通过Thrift的IDL(接口定义语言)来描述接口函数及数 ...

随机推荐

  1. navicat for mysql 连接 mysql 出现Client does not support authentication protocol requested by server解决方案

    一 .桌面左下角windows图标--搜索框内输入cmd,结果如图所示,点击cmd.exe,或者使用快捷键Windows键(在键盘上有个Windows标志的按键)+R输入cmd后回车. 二. 在出来的 ...

  2. 使用hutool进行二维码制作

    2.在IDEA中使用代码块生成二维码

  3. JavaScript-----8.数组

    1.数组的概念 数组是指一组数据的集合,其中每个数据被称为元素,在数组中可以存放任意类型的元素 2. 创建数组 创建数组的两种方式: 利用new创建数组 利用数组字面量创建数组(最常用) 2.1 利用 ...

  4. spring源码分析6: ApplicationContext的初始化与BeanDefinition的搜集入库

    先前几篇都是概念的讲解:回顾下 BeanDefinition 是物料 Bean是成品 BeanFactory是仓库,存储物料与成品 ApplicationContext初始化搜集物料入库,触发生产线, ...

  5. 03-JVM-垃圾回收算法

    1.JVM内存分配与回收 1.1 对象优先在Eden区进行分配 堆中存储的对象,大多数情况下优先存储在Eden区,当Eden区存满没有足够的空间的时候,虚拟机将进行一次minorGC.当满足一定条件以 ...

  6. Java - java概述

    简介: JAVA是一门面向对象的编程语言 1995有sun公司发布 java程序执行流程: xxxjava源文件, 经过编译器编译 产生字节码文件 字节码交给解释器 解释成当前平台的本地机器指令 名词 ...

  7. 机器学习pipeline总结

    # -*- coding: utf-8 -*- """scikit-learn introduction Automatically generated by Colab ...

  8. iOS 自定义导航栏

    参考链接:https://blog.csdn.net/huanglinxiao/article/details/100537988 demo下载地址:https://github.com/huangx ...

  9. 从系统学Android--2.5Activity启动模式

    本系列文章目录:更多精品文章分类 本系列持续更新中.... Activity 的启动模式一共有四种,分别是:standard.singleTop.singleTask.singleInstance . ...

  10. 【Gradle】Android Gradle 多项目构建

    Android Gradle 多项目构建 Android 项目区别 Android项目一般分为库项目,应用项目,测试项目,Android Gradle 根据这些项目分别对应3种插件:com.andro ...