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

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

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

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

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

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

相关文章

sunos 查cpu主频指令prtdiag

sun查cpu主频指令 usr/sbin/psrinfo -v ...虚拟处理器 63 在下列时间的状态&#xff1a;09/10/2013 14:23:52自 04/08/2013 17:41:40 开始已在运行。sparcv9 处理器以 2660 MHz 运行,而且有 sparcv9 浮点数处理器 sun的prtdiag指令: 查cpu个数 bash-3.2$ uname -a SunOS m5000…

使用CDI简化JAX-RS缓存

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

字符串字符和数字分割

现在有个String类型的字符串&#xff1a; String str"AA120"; 我想把它分解成 AA &#xff1b;120 就是把数字和字母分开&#xff1b; 求方法 补充&#xff1a; 格式是前面是字母 不确定几位&#xff0c;后面是数字&#xff0c;也不确定几位 就是"AA111…

transform限制position:fixed的跟随效果

我们应该都知道&#xff0c;position:fixed可以让元素不跟随浏览器的滚动条滚动&#xff0c;而且这种跟随效果连它的兄弟们position:relative/absolute都限制不了。但是&#xff0c;真是一物降一物&#xff0c;position:fixed固定效果却被小小的transform给干掉了&#xff0c;直…

Maven提示:有关可执行jar的所有信息

Maven提示&#xff1a;有关可执行jar的所有信息 在分发代码时&#xff0c;可执行jar是非常有用的工具。 这意味着&#xff0c;只要将Java安装在客户端计算机上&#xff0c;至少在Windows和Mac上&#xff0c;您的用户只需双击jar即可启动程序。 另外&#xff0c;在命令行上&…

C# 查询一张表的数据用于补充另外一张表的数据 MySQL数据库

UPDATE bookhistory bh set bh.CategoryId (SELECT CategoryId FROM booklist bk where bk.Id bh.BookListId)

Gentoo man手册指南

转载&#xff1a;http://www.gentoo.org/doc/zh_cn/man-guide.xml#doc_chap2 http://blog.csdn.net/andyelvis/article/details/4044938 使用man命令技巧 Gentoo man手册指南 内容: 1. 简介2. 使用man结构 1. 简介 man程序 每一个人在他的linux人生中都使用…

Java 8 Lambda表达式教程

问候&#xff01; :) 离开几个月后&#xff0c;我决定恢复风格:)。 我注意到我以前有关新的Date / Time API的一篇文章非常受欢迎&#xff0c;因此这次我将把本篇文章专门介绍Java 8的另一个新功能&#xff1a; Lambda Expressions 。 功能编程 Lambda表达式是Java编程语言最…

React 父组件(hooks)调用子组件(calss)方法

父组件&#xff08;hooks&#xff09; let richTextRef {};<RichText getRichText{getRichText} content{content} onRef{ref > richTextRef ref} />子组件&#xff08;class&#xff09; componentDidMount () > {this.props.onRef && this.props.onRe…

[HDU] 2553 N皇后问题-简单深搜

题目链接&#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid2553 方法&#xff1a; 1.可以用对称的思想&#xff0c;即&#xff1a;如果N是偶数&#xff0c;则只计算第一个皇后分别放在第一行的位置1到N/2这N/2个情况的结果和&#xff0c;最后再乘以2。如果是奇数&#…

您真的了解@WebService吗?

SOAP Web服务无论如何都不是最先进的技术-尽管它仍然存在&#xff0c;但是基于REST的Web服务却提供了激烈的竞争。 无论如何–这绝对不是REST vs SOAP帖子&#xff01; 我观察到了一些实例&#xff0c;至少可以说&#xff0c;使用基于Java的SOAP Web服务的方式不太理想。 我认…

全局使用dva dispatch

// 第一种 这个umi2还可以 umi3就不可以了 window.g_app._store.dispatch({type: login/logout,});// 第二种 调用dispatch(所有models都可以) getDvaApp()._store.dispatch({type: login/logout,});

[转]JQuery.Ajax之错误调试帮助信息

本文转自&#xff1a;http://blog.csdn.net/lampsunny/article/details/8053967 下面是Jquery中AJAX参数详细列表&#xff1a; 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址。 type String (默认: "GET") 请求方式 ("POST&quo…

将策略插入JBoss Apiman

JBoss apiman项目 本周刚刚发布了1.0.3.Final 。 它主要是一个错误修复版本&#xff0c;仅进行了一些相对较小的改进。 自从我上次写博客以来&#xff0c;其中的一个特殊功能就是对插件的支持。 这些插件可以轻松添加到系统中&#xff0c;以提供其他功能。 将策略添加为插件 当…

Error: Module “xxx“ does not exist in container. / antd pro v5启用qiankun报错 / 同时使用mfsu和qiankun报错

一、问题描述 我们用antd pro v5搭建前端项目&#xff0c;启用qiankun微前端模式&#xff0c;终端报错如下&#xff1a; Uncaught (in promise) Error: Module “xxx” does not exist in container. while loading “xxx” from webpack/container/reference/mf 经过排查&…

双链表

问题&#xff1a;在分配空间时&#xff0c;遇到问题 定义一个结构体&#xff1a; typedef struct dLinkListNode{ int data; struct dLinkListNode *prior; struct dLinkListNode *next;}*dLinkList,dListNode; dList(dLinkList)malloc(sizeof(dListNode));与dList(dLinkList)m…

paip.C#.NET多线程访问 toolStripStatusLabel

paip.C#.NET多线程访问 toolStripStatusLabel 作者Attilax &#xff0c; EMAIL:1466519819qq.com toolStripStatusLabel控件比较特殊&#xff0c;无法定义invoke来线程调用。。只好使用原生委托..代码稍微多一些.. delegate void clsC417(); xxx() { …

antd Table/ProList中rowClassName用法(补充记录)

rowClassName{setRowClassName}const setRowClassName (record) > {return record.id currentRecord ? styles.checkstyle : ;};

每个客户使用Jersey处理的Cookie

许多REST服务会将cookie用作身份验证/授权方案的一部分。 这是一个问题&#xff0c;因为默认情况下&#xff0c;旧的Jersey客户端将使用单例CookieHandler.getDefault &#xff0c;大多数情况下&#xff0c;该示例将为null&#xff0c;如果不为null&#xff0c;则在多线程服务器…

domino从Excel导入数据

HTML部分—————————————————————————————————————————————— 1 <table style"WIDTH: 99%; BORDER-COLLAPSE: collapse" class"linkeytable"> 2 <tbody> 3 <tr> 4 <td width"15%&qu…