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

JDK 9向Objects类添加了一些新方法,包括本文中突出显示的两个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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347587.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux下删除只读文件,linux – 我无法删除文件’rm:无法删除X只读文件系统’

我正在尝试删除rdiff备份文件夹,因为备份过程中出现了一些问题,需要删除它的历史记录并重试.但是,当我跑&#xff1a;rm -r -f rdiff-backup-data我在一些文件上得到以下内容&#xff1a;rm: cannot remove X: Read-only file system这是我运行mount时得到的&#xff1a;/dev/s…

让你的数据和对象有源有出路,一文打尽,Java常用IO流处理流(处理字节流文件流)缓冲流、转换流、对象流等

文章目录缓冲流转换流标准输入输出流打印流数据流对象流随机存取文件流Java NIO缓冲流 为了提高数据读写的速度&#xff0c;Java API提供了带缓冲功能的流类&#xff0c;在使用这些流类时&#xff0c;会创建一个内部缓冲区数组&#xff0c;缺省使用8192个字节(8Kb)的缓冲区。 …

异步重试_异步重试模式

异步重试当您有一段经常失败且必须重试的代码时&#xff0c;此Java 7/8库提供了丰富且简洁的API以及针对此问题的快速且可扩展的解决方案&#xff1a; ScheduledExecutorService scheduler Executors.newSingleThreadScheduledExecutor(); RetryExecutor executor new Async…

linux网卡e1000下载,Linux E1000网卡驱动分析

本分析主要针对e1000网卡,驱动源码为7.3.20-k2。本文的目的不是为了讲述如何编写驱动程序,主要是分析网卡驱动内部的实现机制。Linux-千兆网卡驱动实现机制浅析作者: Minit, 出处:博客, 责任编辑: 罗丽艳,2009-03-29 00:001.引言本分析主要针对e1000网卡&#xff0c;驱动源码为…

迈入JavaWeb第一步,Java网络编程基础,TCP网络编程URL网络编程等

文章目录网络编程概述网络通信要素要素一IP和端口号要素二网络协议TCP网络编程UDP网络编程URL网络编程Java网络编程基础网络编程概述 Java是Internet上的语言&#xff0c;它从语言级上提供了对网络应用程序的支持&#xff0c;程序员能够很容易开发常见的网络应用程序。 Java提…

Linux脚本双引号字符去除,shell命令去除字符串里双引号

echo \"refs/changes/84/727284/1\" | sed s/\"//gshell变量内字符替换和变量字符修改a12345123#将${a}里的第一个123替换为321b${a/123/321};echo "echo variable a"echo $aecho "echo variable b"echo $ba12345123#将${a}里的所有123替换…

一个小例子体会Java反射的动态性

背景&#xff1a;需要在程序运行时或者说某段代码运行后才能知道要创建哪个类的对象。 import java.util.Random;/*** Author: Yeman* Date: 2021-10-02-22:18* Description:*/ public class ReflectionTest {public static Object getInstance(String path) throws Exception…

Linux脚本让我选择文件,linux – 用于选择文件和打印文件大小的Awk脚本

我们在这看……select all regular files (not directories or links)到目前为止,你还没有解决这个问题,但如果你在ls -l …的输出中输入,这很容易,请选择/^-/因为目录以d开头,符号链接以l开头,依此类推.只有普通旧文件以 – 开头.现在print out the number of files followed好…

12000+字Java反射,一起全面了解Java反射机制,为学习框架铺路

文章目录Java反射机制理解Class类获取Class类实例类的加载过程类加载器ClassLoader创建运行时类的对象获取运行时类的结构调用运行时类的指定结构动态代理Java反射机制 Reflection是被视为动态语言的关键&#xff0c;反射机制允许程序在执行期借助于Reflection API取得任何类的…

坚实原则:Liskov替代原则

以前&#xff0c;我们深入研究了坚实的原则&#xff0c;包括单一责任和开放/封闭原则。 Liskov替代原则&#xff08;LSP&#xff09;是子类型关系的一种特殊定义&#xff0c;称为&#xff08;强&#xff09;行为子类型&#xff0c; 假设对象S是对象T的子类型&#xff0c;则可…

linux 中 id指令,Linux id 命令

要登入一台计算机&#xff0c;我们需要一个用户名。用户名是一个可以被计算机识别的身份。基于此&#xff0c;计算机会对使用这个用户名的登陆的人应用一系列的规则。在Linux系统下&#xff0c;我们可以使用 id 命令。什么是 id 命令id 命令可以显示真实有效的用户 ID(UID) 和组…

提高Java表达能力!不落伍一起掌握Java8中Lambda表达式、函数式接口及方法构造器数组引用

文章目录函数式接口概述函数式接口示例内置函数式接口Lambda简述Lambda语法方法引用构造器引用数组引用函数式接口概述 只包含一个抽象方法的接口&#xff0c;称为函数式接口。 可以通过 Lambda 表达式来创建该接口的对象。 可以在一个接口上使用 FunctionalInterface 注解&…

linux启动weblogic指令,linux下如何启动和关闭weblogic .

在你定义的域中可以找到如下命令&#xff1a;/[youHome]/domains/[yourDomain]/startWebLogic.sh/[youHome]/domains/[yourDomain]/stopWebLogic.sh用telnet远程控制服务器&#xff0c; 远程启动WEBLOGIC服务&#xff0c;启动后关闭telnet&#xff0c;WebLogic服务也跟着停止&a…

一文一起,学习功能强大的Java8新StreamAPI,让集合的操作得心应手

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 文章目录Stream 概述Stream 实例化Stream 中间操作Stream 终止…

java erlang_Java开发人员的Erlang

java erlang您可能没有注意到&#xff0c;但是距离我上次发布博客已经过去了几个星期。 这是由于我的Soleus骨折了&#xff0c;而且我的腿是石膏模型。 不能动弹&#xff0c;我认为调查完全不同的东西是个好主意–要么看那一天&#xff0c;要么看白天的电视&#xff0c;尽管Koj…

linux 取消混杂模式,Linux下网卡混杂模式设置和取消

1、Linux下网卡常用的几种模式说明&#xff1a;广播方式&#xff1a;该模式下的网卡能够接收网络中的广播信息。组播方式&#xff1a;设置在该模式下的网卡能够接收组播数据。直接方式&#xff1a;在这种模式下&#xff0c;只有目的网卡才能接收该数据。混杂模式&#xff1a;在…

新容器!不再担心空指针, Java8 Optional类

Optional<T>类(java.util.Optional)是一个容器类&#xff0c;它可以保存类型T的值&#xff0c;代表这个值存在。或者仅仅保存null&#xff0c;表示这个值不存在。原来用 null 表示一个值不存在&#xff0c;现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常…

在Docker容器中的Tomcat上运行ADF Essentials

我经常开发示例应用程序。 我尝试了一些想法&#xff0c;运用了一些技巧&#xff0c;并通过示例应用程序与同事和博客读者分享了我的调查结果。 当某人想要了解该技术的实现方式时&#xff0c;他们只需查看源代码&#xff0c;就足以理解这个想法。 但是&#xff0c;如果他们想了…

非cpu0启动linux,SD卡无法启动Linux的问题及解决

最近在Zynq板上启动linaro桌面系统时&#xff0c;发现一个奇怪的问题&#xff0c;系统在启动到最后&#xff0c;已经打印了如下信息&#xff1a;[drm] Initialized axi_hdmi_drm 1.0.0 20120930 on minor 0&#xff0c;按理说后面就该是登录系统并显示shell提示符了&#xff0c…

新!详细!win10下MySQL数据库干净卸载安装与配置

微信公众号&#xff1a;创享日记 发送&#xff1a;sqlyog 获取SQLyog客户端安装包 文章目录官方下载卸载清除安装变量配置测试SQLyog客户端下载官方下载 链接直达&#xff1a;点击官方下载 1、选择 2、下载&#xff1a;点击download进入下载页面&#xff0c;选择“No thanks,…