JDK 9:NotNullOrElse方法已添加到Objects类

JDK 9Objects类添加了一些新方法,包括本文中突出显示的两个static方法: requireNonNullElse(T,T)requireNonNullElseGet(T obj,Supplier <?extended T>供应商) 。 这两种方法使得更容易验证给定的对象是 null ,并且如果提供可变原来是提供一种替代的null 。 因此,这些方法和早期JDK版本中引入到Objects的相似方法[ requireNonNull(T)requireNonNull(T,String)requireNonNull(T,Supplier <String>) ]最有可能用于在方法中实现保护子句

当确定要测试的对象为null时,在上一段中提到的在JDK 9之前添加到Objects的三种方法不允许使用“默认”值。 相反,当传递给它们的变量为null时,这三个方法中的每一个都会引发NullPointerException 。 在JDK 9中添加到Objects的两个方法确实允许指定一个默认值,该默认值可以由该方法返回,而不是该方法抛出NullPointerException

Objects.requireNonNullElse(T,T)是两个新添加的方法中最直接的方法,用于指定当所测试的变量为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();
}

在上面的示例中,如果提供的Date类型的变量为null ,则返回提供的默认值“ now”(基于调用不接受参数Date构造函数 )。

JDK 9还添加了Objects.requireNonNullElseGet(T,Supplier <? 该方法与前面讨论的方法的不同之处在于,它接受提供默认值的供应商 ,而不是接受相同类型的另一个对象作为默认值。

在强烈推荐的《 现代Java食谱 》一书中, Ken Kousen写道:“ Supplier的主要用例之一是支持延迟执行的概念。” 在讨论了Supplier在JDK中的用法之后,他补充说:“可以在您自己的代码中使用此延迟执行过程,以确保仅在适当时才从Supplier检索值。” 我的下一个示例演示了这一点。

接下来显示一个高度人为的代码清单,该清单演示了此方法接受Supplier

Objects.requireNonNullElseGet​(T,Supplier<? extends 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} 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 ,不会调用长时间运行的方法。 [顺便说一句,我在这里没有显示calculateDate()的实现,因为它是可笑的,但是可以说它有意地花费很长时间来执行。

覆盖在这个岗位,这两种方法可以很容易地检测一个特定的变量为null ,并代替它提供了一个合适的替代品时,它是null 。 这些可能最常用于实现“保护条款”,但是它们返回默认值的能力也可能导致其他用例。

翻译自: https://www.javacodegeeks.com/2018/02/jdk-9-notnullorelse-methods-added-objects-class.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值