海盗云商插件_推销自己的海盗猫王运营商

海盗云商插件

因此,Java没有Elvis运算符(或者,更正式地讲,它没有null合并运算符或null安全成员选择)……虽然我个人不太在意它,但有些人似乎很喜欢它。 当一位同事需要几天后,我坐下来探讨了我们的选择。

而且你知道什么! 您可以非常接近方法引用。

总览

我们首先来看看猫王经营者是什么以及为何涉及海盗。 然后,我将展示如何使用实用程序方法来实现它。

可以在专用的GitHub项目中找到实现,演示和本文中的大多数示例。 该代码是Public Domain,因此您可以不受限制地使用它。

他不是死了吗?

我也这样认为,但显然不是 。 就像关于国王还活着的谣言一样,希望猫王经营者的人们也从未消亡。 因此,让我们看看他们想要什么。

由That Hartford Guy根据CC-BY-SA发布。

发布时间由这哈特福德盖伊在CC-BY-SA 。

(如果您想自己阅读有关它的讨论,请参阅OpenJDK邮件列表上的该主题 ,Stephen Colebourne在其中为Java 7提出了这些运算符。)

猫王算子

Elvis最简单的形式是一个二进制运算符,它选择非null操作数,而优先选择左边的操作数。 所以代替...

private String getStreetName() {return streetName == null ? "Unknown Street" : streetName;
//	or like this?
//	return streetName != null ? streetName : "Unknown Street";
}

…你可以写…

private String getStreetName() {return streetName ?: "Unknown Street";
}

我可以用Java来获得这个。 对于经常使用的模式,这是一个不错的捷径,可以避免我浪费时间来决定用哪种方式对三元运算符进行排序? :”(因为我总是想知道我是要把常规情况放在首位还是要避免双重否定)。

用静态效用函数来模拟它当然是微不足道的,但是,我也说,边界是毫无意义的。 静态导入该方法并让所有代码阅读者查找其含义的工作胜过其所提供的一点好处。

所以我不是在谈论这个猫王。 顺便说一句,之所以这样称呼,是因为?:看起来像带有蓬皮杜鹃的笑脸。 如果不是猫王的话,那会是谁呢?是的,这就是我们行业内一直选择名字的方式! 更正式地说,它也称为空合并运算符 。

海盗猫王操作员

然后还有另一件事似乎没有它自己的名字,这就是我想谈的。 它有时也被称为猫王,但有时却得到方便的名称,例如“ null-safe成员选择运算符”。 至少,这很好地解释了它的作用:如果在其上调用该成员的实例为null,则短路成员选择,以便整个调用返回null。

当您要链接方法调用时,这很方便,但是其中一些可能返回null。 当然,您必须对此进行检查,否则会遇到NullPointerExeption。 这可能导致相当丑陋的代码。 代替…

private String getStreetName(Order order) {return order.getCustomer().getAddress().getStreetName();
}

…你必须写…

private String getStreetName(Order order) {Customer customer = order == null ? null : order.getCustomer();Address address = customer == null ? null : customer.getAddress();return address.getStreetName();
}

这显然是可怕的。 但是使用“空安全成员选择运算符”:

private String getStreetName(Order order) {return order?.getCustomer()?.getAddress()?.getStreetName();
}

看起来更好吧? 是。 它让您忘记所有讨厌的null,是吗? 是。 所以这就是为什么我认为这是一个坏主意。

字段经常是设计错误的根源。 对于Java 8,您可以使用Optional来避免null 。 因此,实际上应该没有什么理由可以使空值抛出变得更加容易。 也就是说,有时您仍然想要,所以让我们来看看如何接近。

顺便说一句,由于该变体似乎还没有正式术语,因此我将其命名为?。 Pirate-Elvis运算符(请注意缺少的眼睛)。 记住,您首先在这里阅读! ;)

实施海盗猫王运营商

现在我们知道了我们在说什么,让我们开始实施它。 我们可以为此使用Optional或编写一些专用方法。

带可选

只需将第一个实例包装在Optional中,然后将链接函数用作地图即可:

private String getStreetName(Order order) {return Optional.ofNullable(order).map(Order::getCustomer).map(Customer::getAddress).map(Address::getStreetName).orElse(null);
}

这需要很多样板,但已经包含了关键方面:使用方法引用指定要调用的方法,如果为空(在这种情况下导致空的Optional),则不要调用这些方法。

我仍然喜欢此解决方案,因为它清楚地记录了这些调用的可选性。 做正确的事情并以Optional<String>返回街道名称也很容易(实际上使代码更短)。

使用专用实用程序方法

从使用Optional的解决方案开始,为这种特殊情况找到更短的方法非常简单:只需将实例和方法引用交给专用方法,然后在第一个值为null时对其进行分类。

空合并功能应用

public static <T1, T2> T2 applyNullCoalescing(T1 target,Function<T1, T2> f) {return target == null ? null : f.apply(target);
}public static <T1, T2, T3> T3 applyNullCoalescing(T1 target,Function<T1, T2> f1, Function<T2, T3> f2) {return applyNullCoalescing(applyNullCoalescing(target, f1), f2);
}public static <T1, T2, T3, T4> T4 applyNullCoalescing(T1 target,Function<T1, T2> f1, Function<T2, T3> f2,Function<T3, T4> f3) {return applyNullCoalescing(applyNullCoalescing(target, f1, f2), f3);
}public static <T1, T2, T3, T4, T5> T5 applyNullCoalescing(T1 target,Function<T1, T2> f1, Function<T2, T3> f2,Function<T3, T4> f3, Function<T4, T5> f4) {return applyNullCoalescing(applyNullCoalescing(target, f1, f2, f3), f4);
}

(此实现为简洁起见进行了优化。如果显式实现每种方法,则可以提高性能。)

使用方法引用可以很容易地调用这些方法:

private String getStreetName(Order order) {return applyNullCoalescing(order,Order::getCustomer, Customer::getAddress, Address::getStreetName);
}

还是没有order?.getCustomer()?.getAddress()?.getStreetName(); 但关闭。

反射

我们已经看到了空合并运算符(?:)和空安全成员选择运算符(?。)是什么。 即使后者可能会鼓励不良习惯(传递空值),我们还是使用实用方法来实现它,该方法可以通过方法引用来调用。

您喜欢的任何代码都可以免费使用。

翻译自: https://www.javacodegeeks.com/2015/03/roll-your-own-pirate-elvis-operator.html

海盗云商插件

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

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

相关文章

英文期刊催稿信模板_手把手教你写投稿信,另附查尔斯沃思高质量模板

导语本文是查尔斯沃思作者服务关于学术论文写作系列文章的最后一篇&#xff0c;我们邀请英国编辑团队资深成员&#xff0c;根据其自身丰富的撰稿经验&#xff0c;为中国作者呈现系统全面的写作指导建议&#xff0c;我们将其翻译成中文&#xff0c;方便大家理解。希望本系列文章…

63权限提升-Linux脏牛内核漏洞SUID信息收集

今天讲到的方法是suid和内核漏洞 案例一Linux 提权自动化脚本利用-4 个脚本 两个信息收集&#xff1a;LinEnum、linuxprivchecker 两个漏洞探针&#xff1a;linux-exploit-suggester、linux-exploit-suggester2 信息收集有什么用&#xff1f; 信息收集就能判断能否进行s…

擦窗机器人不用时怎么收纳_省心省力,智能擦窗机器人

以前擦窗户&#xff0c;一手湿抹布一手干抹布&#xff0c;身边再放点儿报纸&#xff0c;可能还得再来一个人换洗抹布。一天下来&#xff0c;两个人都是腰酸背痛的。对于又爱干净又是懒癌星人的人来说&#xff0c;玻妞擦窗机器人&#xff0c;让大家不用爬上爬下&#xff0c;也能…

C语言变量定义和赋值

定义变量的格式非常简单&#xff0c;如下所示&#xff1a;数据类型 变量名;首先要强调的一点是&#xff1a;最后的分号千万不要丢了。变量的定义是一个语句&#xff0c;我们说过&#xff0c;语句都是以分号结尾的。“数据类型”表示想要存储什么类型的数据就定义什么类型的变量…

win7计算机盘共享,win7电脑如何共享文件夹 win7电脑共享文件夹操作方法

我们在工作当中&#xff0c;中是喜欢在电脑当中创建一个文件夹&#xff0c;然后把东西放进这个文件夹当中&#xff0c;最后实现共享&#xff0c;这样的方式能够为我们省去不少时间&#xff0c;那么win7电脑如何共享文件夹呢?今天为大家带来win7电脑共享文件夹的操作步骤。win7…

cdi-api_使用CDI简化JAX-RS缓存

cdi-api这篇文章&#xff08;通过一个简单的示例&#xff09;说明了如何使用CDI Producers使其在RESTful服务中利用缓存控制语义更加容易 与HTTP 1.0中可用的Expires标头相比&#xff0c; HTTP 1.1中添加了Cache-Control标头&#xff0c;这是急需的改进。 RESTful Web服务可以…

【C语言】结构体赋值

结构体在 C 程序中使用的较为频繁&#xff0c;能对数据有一定的封装的作用。对一个结构体赋值时&#xff0c;经常采用的方式是&#xff0c;分别对其成员变量赋值。那么能否将一个结构体用赋值号&#xff08;“”&#xff09;直接赋值给另一个结构体呢&#xff1f;网上的答案不一…

vue 传参 微信_vue-router 你可能忽略的知识点

vue-router相信大家都不陌生&#xff0c;并且很多都有实战经验。可能有很多你忽略的一些点。1、丑陋的hash值vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL&#xff0c;于是当 URL 改变时&#xff0c;页面不会重新加载。const router new VueRouter(…

适合计算机64位的cad,【1人回答】求一个能适用于CAD2008的纬地,我的电脑是Win7 64位的-3D溜溜网...

回答&#xff1a;下载方法&#xff1a;1、建立临时目录&#xff0c;如 CAD20082、下载AutoCAD2008安装软件&#xff0c;将文件复制到CAD2008目录下。3、将 CAD2008 文件夹中的 zh-cn 文件夹改名为 en-us&#xff1b;4、下载“AutoCAD 2008 64 位补丁包(下载地址&#xff1a;ACA…

C |格式化输出与变量类型

C语言 格式化输出与变量类型 1、格式化输出在PHP里面&#xff0c;我们一般都是用echo和var_dump以及print_r等来输出调试语句&#xff0c;在&#xff23;语言中一般用printf来输出&#xff0c;不过由有点特殊&#xff0c;你需要在输出的时候指定输出的数据类型&#xff1a;#in…

信工干货||C语言输入输出语句

数据输入与输出C语言无I/O语句&#xff0c;I/O操作由函数实现putchar( ) getchar( ) printf( ) scanf( ) puts( ) gets( )#include或#include “stdio.h”数据输出字符输出函数格式&#xff1a;putchar&#xff08;c&#xff09;参数&#xff1a;c为字符型或整型常量、变量或表…

如何设置网件gs108e_Netgear 网件 EAX80 AX6000规格 无线扩展器 开箱拆解评测

前言众所周知&#xff0c;国行网件RAX系列默认中国区&#xff0c;这就导致了路由器的发射功率不会高&#xff0c;所以很多人觉得国行RAX无线路由器信号覆盖不尽如意。为了解决这个问题&#xff0c;本次为大家介绍一款WiFi 6信号扩展器—EAX80(官网链接)&#xff0c;它可以将高强…

饥荒海难创建显示专用服务器,饥荒创建世界时一直显示启动服务器 | 手游网游页游攻略大全...

发布时间&#xff1a;2017-08-07TGP版怎么建立服务器呢?各位知道在TGP里如何创建服务器吗?这里给大家带来了TGP版服务器创建开服方法,教大家TGP如何创建服务器,还不会的玩家,一起来了解下吧. >&gt ...标签&#xff1a;攻略发布时间&#xff1a;2015-12-20联机过程中有…

C语言 | 6种常用的转换工具函数盘点

字符串转十六进制代码实现&#xff1a;void StrToHex(char *pbDest, char *pbSrc, int nLen){ char h1,h2; char s1,s2; int i; for (i0; i2; i) { h1 pbSrc[2*i]; h2 pbSrc[2*i1];s1 toupper(h1) - 0x30; //toupper 转换为大写字母 if (s1 > 9) s1…

企业联合体的形式_联合体如何联合?——总包新政下,联合体如何联合?系列三...

以下文字为根据科思顿企业咨询管理(上海)有限公司合伙人胡建于2020年4月10日的网课核心内容摘录&#xff0c;因内容较多&#xff0c;分三个系列发布&#xff0c;包括&#xff1a;系列之一、为什么政策突变&#xff1f;系列之二、联合体是什么&#xff1f;系列之三、联合体如何联…

vue2 怎么用vite_Vue2和Vue3开发组件有什么区别

我们一直都有关注和阅读很多关于Vue3的新特性和功能即将到来。但是我们没有一个具体的概念在开发中会有如何的改变和不一样的体验。还有一些童鞋已经开始又慌又抓狂了 -- “又要开始学新的写法了 (ノToT )ノ ~┻┻”。所以这里我使用Vue2和Vue3开发一个简单的表格组件来展示一下…

C语言中实现边沿函数算法及应用,这是抛弃PLC留下的痛!

很多从事PLC编程的朋友都知道&#xff0c;不管是什么品牌的PLC&#xff0c;都有上升沿和下降沿指令。❤那么什么情况下我们才会使用或必须使用边沿信号呢&#xff1f;边沿信号我们又如何获取呢&#xff1f;如图1&#xff0c;任何一个开关信号&#xff08;或数字信号&#xff09…

服务器系统装驱动精灵,云服务器安装驱动精灵

云服务器安装驱动精灵 内容精选换一换您可以选择在云服务器上安装一个或多个应用。如需在云服务器上安装其他应用&#xff0c;请参考如下操作进行添加。暂时仅允许支持VR应用的云服务器安装VR应用。暂时仅允许支持3D应用的云服务器安装3D应用。暂时仅允许支持VR应用的云服务器有…

注入器 过检测_连云港管道检测服务

连云港管道检测服务 管道稀释淤泥施工时应采用专业高压水车将两个检查井注入室内灌水&#xff0c;并使用挖泥机将检查井中的污泥与排污管混合&#xff0c;以稀释污泥为目的. 如果是手工作业应与机械作业配合以不断搅拌污泥&#xff0c;直到将其稀释到水中为止.管道吸污。 公司备…

lock.lock_HibernateCascadeType.LOCK陷阱

lock.lock介绍 引入了Hibernate 显式锁定支持以及Cascade Types之后 &#xff0c;就该分析CascadeType.LOCK行为了。 Hibernate锁定请求触发内部LockEvent 。 关联的DefaultLockEventListener可以将锁定请求级联到锁定实体子级。 由于CascadeType.ALL也包括CascadeType.LOCK …