前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Optional 理解

Optional 理解

作者头像
希希里之海
发布2019-09-11 15:04:30
7660
发布2019-09-11 15:04:30
举报
文章被收录于专栏:weixuqin 的专栏

目录

  • Optional 理解
    • 1. 含义
    • 2. Optional 类中方法
    • 3. Optional 对象不应该作为方法参数

Optional 理解

1. 含义

Optional 是一个容器对象,该容器里可能包含非空值也可能不包含非空值。最主要的用途就是为了规避 NPE 异常(传入的对象为 null 造成)。

  • 如果存在值,通过 isPresent 方法返回 true,通过 get 方法获取 value

Optional 也提供了额外的方法,这些方法根据是否存在 value 来发挥作用。

注意

请不要在 Optional 对象中使用 hashcodesynchronized== ,否则会产生不可预料的影响。因为 Optional 是基于值的类。

基于值的类(Value-based Classes)

关于什么是 Value-based Clases,我找到 Oracle 的一篇官方文档:Value-based Classes

某些类(如 java.util.Optional 和 java.time.LocalDateTime) 是基于值的。基于值的实例有如下特征:

  • 具有 final 属性,是不可更改的(尽管可能包含对可变对象的引用)
  • 具有 equals()hashCode()toString() 方法的实现,且实现方法仅依赖于实例自身的状态发生变化,而不依赖外部的对象或变量的状态
  • 不使用身份敏感的操作,使用 == 比较两个实例,使用 hashcode 获取实例信息,使用 synchronized 获取内部锁
  • 两实例是否相同是根据 equals() 方法而不是 ==
  • 没有公开的构造方法,而是通过工厂方法(Factory method)来产生实例
  • 若两实例相同,则可以互相替代,且不会有不同的行为

2. Optional 类中方法

2.1 构造方法
代码语言:javascript
复制
private Optional(T value) {
    this.value = Objects.requireNonNull(value);
}
  • Optional 是一个容器,容器里面包着一个值,这个值是泛型
  • 因为构造方法私有化,所以不能通过 new 新建 Optional 对象,只能通过静态工厂方法构造对象
2.2 创建 Optional 对象方法
  • of:返回一个容器的值不为 null 的对象,使用该方法要求调用者调用 of 方法时,参数值不为空,否则会抛出 NPE 异常。 public static <T> Optional<T> of(T value) { return new Optional<>(value); }
  • ofNullable:构造一个可能为空,也可能不为空的 optional 对象。 public static <T> Optional<T> ofNullable(T value) { return value == null ? empty() : of(value); }
  • empty:返回容器的值为 null 的对象 public static<T> Optional<T> empty() { @SuppressWarnings("unchecked") Optional<T> t = (Optional<T>) EMPTY; return t; }
2.3 其他方法
  • isPresent:判断该对象是否存在
  • get:获取容器的值
  • orElse:容器值不为空,将 value 打印出来;为空,返回指定值。 public T orElse(T other) { return value != null ? value : other; }
  • orElseGet:该方法不接受参数。容器值不为空,返回 value;为空,返回指定值 public T orElseGet(Supplier<? extends T> other) { return value != null ? value : other.get(); } 举例: System.out.println(optional.orElseGet(() -> "nihao"));
  • orElseThrow:容器值不为空,返回 value;为空,抛出异常。
  • map:映射,将一个值映射成另一个值。如果有值,则对其执行调用映射函数得到返回值。如果返回值不为 null ,则创建包含映射返回值的 Optional 作为 map 方法返回值,否则返回空 Optional 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)); } } 举例: System.out.println(optional.map(thecompant -> theCompany.getEmployees()). orElse(Collections.emptylist()));

注意 在企业开发中,我们经常通过 orElse 来规避 NPE 异常。

3. Optional 对象不应该作为方法参数

Optional 无法被序列化。所以不要试图将 Optional 作为方法参数进行定义,也不要在类当中声明 Optional 类型的成员变量。Optional 通常只作为方法的返回值,用来规避空指针异常。

在使用 Optional 时,应该使用函数式的编程风格。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-09-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Optional 理解
    • 1. 含义
      • 2. Optional 类中方法
        • 3. Optional 对象不应该作为方法参数
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档