因此,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();
}

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

字段经常是设计错误的根源。 对于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);
}

这需要很多样板,但已经包含一些关键方面:使用方法引用指定要调用的方法,并且如果某些内容为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(); 但关闭。

反射

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

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

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

推销自己的海盗猫王运营商相关推荐

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

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

  2. 华为运营商模式渐现困局:开始围剿企业级用户 (转载)

    华为2012 收入:35 billion,净利润:2.4billion Huawei announced a return to growth in profits for 2012, after a ...

  3. 关于微信,运营商们就这点志向?

    2019独角兽企业重金招聘Python工程师标准>>> 近期关于运营商威逼微信收费之事闹得沸沸扬扬,在虎嗅上看到有不少人发表了自己的看法也不乏给运营商或微信出点子的人,但我觉得都不是 ...

  4. 漫画:云市场下,运营商甲方爸爸也出来抢乙方生意了?

    在一个大佬云集的群里面,某银行技术负责人大B哥一句貌似平淡无奇的问题一石激起千层浪 『大家版本回退是怎么做的?』 『有一把梭不回退的』 『有推荐CI/CD的』 『还有业务不允许回退的』 『在一个见缝插 ...

  5. 运营商大数据产业链迎机遇

    "人类正从IT时代走向DT时代."阿里巴巴集团创始人马云在各种场合都不遗余力地推销自己的观点,信息社会已经进入了大数据(Big Data)时代.利用所有的数据,而不再仅仅是一部分. ...

  6. 为什么运营商大数据可以精准获客?

    "获客难","获客成本高",一直是困扰企业的大问题,身边的许多朋友在吐槽客户的意向度不高,总是无法成交,员工非常积极主动去跟踪客户了,但始终事倍功半,这就像是老 ...

  7. 运营商大数据如何成为企业未来发展趋势!

    随着互联网发展到今天,人类生活的方方面面似乎已经离不开大数据,从本质上说,"大数据"所代表的是当今社会所特有的一种新型的能力,然而对于企业来说,"获客难",&q ...

  8. 苹果iMessage垃圾信息泛滥:运营商难涉及

    随着监管部门和三大电信运营商加大了对垃圾短信的整治力度,垃圾短信的数量明显减少,然而来自苹果(593.76, 0.93, 0.16%)iMessage的垃圾信息却不减反增,成为垃圾信息的重灾区,给iP ...

  9. 运营商精准大数据——主动出击 精准获客_用户_客户_实时

    获客难","获客成本高",一直是困扰企业的大问题,身边的许多朋友在吐槽客户的意向度不高,总是无法成交,员工非常积极主动去跟踪客户了,但始终事倍功半,这就像是老人们常说的一 ...

最新文章

  1. 用半机械器官,打开发育生物学领域的黑匣子
  2. linux安装mysql php_Linux 安装mysql和php
  3. 基于python的scrapy爬虫抓取京东商品信息
  4. 用java调用oracle存储过程总结二
  5. MySQL不能查看表_mysql root用户登录后无法查看数据库全部表
  6. 从零入门 Serverless | Knative 带来的极致 Serverless 体验
  7. 在远程桌面在目标主机与客户机复制文件?
  8. 实现“Please wait...”效果
  9. win7超极本盘符不见找回文件的方法
  10. Spring boot (1)--- 第一个应用程序helloworld
  11. html select下拉菜单长度过长不出滚动条问题解决办法
  12. sql 分页查询 (每次6行 )
  13. (转)用AGG实现高质量图形输出(四)
  14. dms mysql 工具_数据库管理工具DMS
  15. 回溯算法-八皇后问题
  16. python正则匹配连续相同字符_正则表达式: 匹配n个相同连续字符
  17. 考研复试之路:不努力怎敢轻易言弃
  18. 使用Dockerfile创建包含nginx-fair和nginx-check模块的nginx镜像
  19. 一文了解循环神经网络
  20. linux下terminal重命名方法

热门文章

  1. java中判断数组中元素出现的次数
  2. 三个水桶(看了三遍,想了五遍!)
  3. Java web登录拦截器_SpringMVC拦截器(实现登录验证拦截器)
  4. qt4.8 mysql 驱动_Qt-4.8.5配置mysql驱动
  5. 阳泉2021高考成绩查询时间段,2021年阳泉高考成绩排名及成绩公布时间什么时候出来...
  6. 萤石云好友分享的监控怎么看_萤石S1:英超赛场上雄起的中国品牌
  7. docker export_docker使用简介
  8. 电脑任务栏跑到右边去了_电脑没有声音怎么解决 电脑没有声音解决方法【详解】...
  9. Servlet请求和响应总结
  10. rpc结构错误_结构性错误