海盗云商插件

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

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

总览

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

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

他不是死了吗?

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

发布时间由这哈特福德盖伊在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

海盗云商插件

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

  1. 推销自己的海盗猫王运营商

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

  2. roads 构筑极致用户体验_万物互联大势所趋 华为保驾护航运营商“三个转型”...

    随着通信技术及其应用的快速发展,人们发现物理世界和数字世界正在加速融合,数字经济正在改变和颠覆着传统市场格局.于是人们看到,电子商务.远程教育.远程医疗.物联网.大数据等等,一波接一波的商业浪潮不断涌 ...

  3. 无法上网dns转发_从DoH到ODoH,运营商再也不能搞DNS劫持了

    不久前,此前一直高举免费大旗的360,旗下浏览器传出了即将推出收费会员的消息,尽管随后官方表声明称,收费其实是浏览器团队在小规模测试个性化增值服务.不过此次传出360浏览器的六大VIP权益也引发了外界 ...

  4. 海盗云商php,海盗云商(2.2.1.160429)前台无限制注入(无需登录,无视GPC)

    漏洞触发点 在/system/module/goods/control/index_control.class.php中第105行: public function ajax_goods(){ $sq ...

  5. java手机号判断运营商_用Java对手机号所属运营商进行判断

    [要更加准确的匹配手机号码只匹配11位数字是不够的,比如说就没有以144开始的号码段, 故先要整清楚现在已经开放了多少个号码段,国家号码段分配如下: 移动:134.1 package com.yuni ...

  6. 华三服务器管理口地址_路由器LAN口接入其他运营商宽带导致上网不稳定案例分析...

    故障现象 用户反馈网络不稳定,经常掉线. 故障分析 路由器问题导致网络不稳定. 故障排查 笔记本直连用户家里路由器,进行ping包,网络正常无掉线现象 . 用笔记本直连路由器测速,测速结果为:50M ...

  7. java 判断手机运营商_如何用java判断手机号运营商?

    如何用java实现判断手机号的运营商?因为每个号段都是工信部规定划分给指定运营商的,所以我们可以通过手机号码的号段来判断. 现在手机号的号段那么多,要怎样方便的的判断呢?于是我们就想到了正则表达式,在 ...

  8. java 判断手机号_如何用java判断手机号运营商?

    如何用java实现判断手机号的运营商?因为每个号段都是工信部规定划分给指定运营商的,所以我们可以通过手机号码的号段来判断. 现在手机号的号段那么多,要怎样方便的的判断呢?于是我们就想到了正则表达式,在 ...

  9. php取商,PHP 免费获取手机号的归属地,运营商等数据

    /*** * 获取手机号的归属地 * @param $phone //手机号 * @return string */ function GetPhoneLocation($phone){ if (em ...

最新文章

  1. 京东API网关实践之路!
  2. DeprecationWarning: Function log_multivariate_normal_density is deprecated; The function log_multiva
  3. 爬虫 wordcloud操作
  4. django的视图与模板
  5. 常用的密码破解方法大汇总 zz
  6. 基于 MVP 的 Android 组件化开发框架实践 1
  7. 九眼合同智能审核系统运用NLPIR大数据技术进行核查
  8. 【NOIP1999】【Luogu1020】导弹拦截
  9. 图像上采样和图像下采样
  10. JavaScript调用Linux系统命令
  11. 串口服务器芯片方案,串口转以太网单芯片
  12. vega56刷64_A卡—Vega56的简易玩法
  13. 肇庆学院计算机论文选题,肇庆学院本科毕业论文(设计)写作与印制规范
  14. GoAhead_UserGuide_1
  15. SQL查询语句分步详解——多字段分组查询
  16. 【群晖】希捷酷狼8T硬盘声音过大问题
  17. u盘启动盘一键装系统教程
  18. 【每日笔记】:layui表单checkbox设为必选
  19. 三国志11板游戏资源及问题解决
  20. 【Golang】安装 iris 的方法

热门文章

  1. P5135-painting【组合数学】
  2. 欢乐纪中A组周六赛【2019.4.13】
  3. 2021牛客暑期多校训练营3 B-Black and white(思维+最小生成树)
  4. 汇编语言(二)之数值求和
  5. 微服务为什么选Spring Cloud
  6. 扫盲,为什么分布式一定要有Redis?
  7. 漫画:什么是单例设计模式
  8. TypeError: Cannot set property 'msg' of undefined
  9. JS中闭包的应用自定义JS模块
  10. Redis非阻塞I/O多路复用机制