当前位置: 首页 > news >正文

猫头鹰的深夜翻译:JDK9 NotNullOrElse方法

前言

本篇文章重点讨论JDK9中添加的静态方法,requireNonNullElserequireNonNullElseGet

正文

JDK9在Object类中新添加了两个静态方法,requreNonNullElse(T, T) requireNonNullElseGet(T obj,Supplier<? extends T> supplier)。这两个方法简化了判断对象是否为空(null),如果是空的则返回一个默认值。因此,这两个方法和早期JDK版本中引入的方法requireNonNull(T),requireNonNull(T,String)requireNonNull(T,Supplier<String>)可以用来进行防御性编程。

在JDK9之前加入的三个方法并不支持在对象为空时返回一个默认值。取而代之的是,这三个方法会抛出NullPointerException。JDK9中新加入的两个方法则会在传入值为null时返回一个默认值。

Objects.requireNonNullElse(T,T)是新加入的两个方法中,最直接明了的定义返回值的方法。下面的这段代码展示了如何使用该方法:

/**
 * Provide instance of {@code Instant} that corresponds to
 * the provided instance of {@code Date}.
 *
 * @param inputDate Instance of {@code Date} for which
 *    corresponding instance of {@code Instant} is desired;
 *    if this is {@code null}, an {@code Instant} representing
 *    "now" will be returned.
 * @return Instance of {@code Instant} extracted from provided
 *    {@Date} that will instead represent "now" if provided
 *    {@code Date} is {@code null}.
 */
public Instant convertDateToInstantWithNowDefault(final Date inputDate)
{
   final Date dateToConvert
      = Objects.requireNonNullElse(inputDate, new Date());
   return dateToConvert.toInstant();
}

在上面的例子中,如果提供的参数对象inputDate为null的话,默认值nownew Date()构造函数返回当前的时间)将会作为默认值返回。

JDK9还加了一个有相同功能的Objects.requireNonNullElseGet(T,Supplier<? extends T>)方法。这个方法和上一个方法的区别是,它接收一个Supplier对象来提供默认值,而不是直接返回一个同类型的对象作为默认值。

Modern Java Recipes, Ken Kousen 这本书中写道:Supplier S的基本用途之一就是支持延迟执行。在讨论了如何使用JDK中的Supplier之后,他还补充了:可以在代码中使用延迟执行,从而确保只有在时机合适时才会从Supplier处获取值。

下面展示了该方法的使用:

/**
 * Provide instance of {@code Instant} that corresponds to
 * the provided instance of {@code Date}.
 *
 * @param inputDate Instance of {@code Date} for which
 *    corresponding instance of {@code Instant} is desired;
 *    if this is {@code null}, an {@code Instant} based on
 *    a complicated date calculation will be returned.
 * @return Instance of {@code Instant} extracted from provided
 *    {@Date} that will instead represent a calculated date if
 *    provided {@code Date} is {@code null}.
 */
public Instant convertDateToInstantWithCalculatedDefault(final Date inputDate)
{
   final Date dateToConvert
      = Objects.requireNonNullElseGet(inputDate, () -> calculateDate());
   return dateToConvert.toInstant();
}

当获取默认值的过程预计会运行较常时间时,传入一个Supplier作为获取默认值的方法会很有优势。这时,只有当传入的第一个参数为null时才会执行该方法。当传入的第一个参数不是null时,该方法将不会被调用。

本文中提到的两个方法简化了判断一个参数是否为null并在为null时返回一个默认值的过程。它们最长用来实现防御性编程,当然也有其他的应用场景。

相关文章:

  • 提高开发效率之VS Code基础配置篇
  • 【301】IDL与C#混合编程
  • 小总结
  • 【18】万魂杀服务器开发之SDK接入
  • 12c broker fast-start failover - ORA-16820解决
  • Nginx配置——区分PC或手机访问不同域名
  • Eclipse MicroProfile 1.3现已发布
  • VTP的模式(思科)
  • 掀开图片显示介绍的css效果
  • JS判断某变量是否为某数组中的一个值的3种方法
  • Hook技术--Activity的启动过程的拦截
  • AR和VR持续升温,2020年市场规模将达1500亿美元
  • 【转】给Java说句公道话
  • 你可能不知道的Shell
  • Nginx 调优经验记录
  • Cookie 在前端中的实践
  • ERLANG 网工修炼笔记 ---- UDP
  • Java小白进阶笔记(3)-初级面向对象
  • Laravel 实践之路: 数据库迁移与数据填充
  • leetcode98. Validate Binary Search Tree
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Vue.js源码(2):初探List Rendering
  • 聊聊hikari连接池的leakDetectionThreshold
  • 爬虫模拟登陆 SegmentFault
  • 前端面试之CSS3新特性
  • 实现菜单下拉伸展折叠效果demo
  • 使用agvtool更改app version/build
  • 我从编程教室毕业
  • 项目实战-Api的解决方案
  • 一、python与pycharm的安装
  • 用简单代码看卷积组块发展
  • 再谈express与koa的对比
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​马来语翻译中文去哪比较好?
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • ###C语言程序设计-----C语言学习(6)#
  • #define与typedef区别
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (六)vue-router+UI组件库
  • (转)拼包函数及网络封包的异常处理(含代码)
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET导入Excel数据
  • .net连接oracle数据库
  • .NET命令行(CLI)常用命令
  • .php文件都打不开,打不开php文件怎么办
  • // an array of int
  • /proc/vmstat 详解
  • [2016.7 day.5] T2
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法
  • [AIGC] 如何建立和优化你的工作流?
  • [BT]BUUCTF刷题第4天(3.22)