北京网站建设公司司,网站备案和icp备案,分析网页设计布局,wordpress联系表单海盗云商插件因此#xff0c;Java没有Elvis运算符#xff08;或者#xff0c;更正式地讲#xff0c;它没有null合并运算符或null安全成员选择#xff09;……虽然我个人不太在意它#xff0c;但有些人似乎很喜欢它。 当一位同事需要几天后#xff0c;我坐下来探讨了我们… 海盗云商插件 因此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则不要调用这些方法。 我仍然喜欢此解决方案因为它清楚地记录了这些调用的可选性。 做正确的事情并以OptionalString返回街道名称也很容易实际上使代码更短。 使用专用实用程序方法 从使用Optional的解决方案开始为这种特殊情况找到更短的方法非常简单只需将实例和方法引用交给专用方法然后在第一个值为null时对其进行分类。 空合并功能应用 public static T1, T2 T2 applyNullCoalescing(T1 target,FunctionT1, T2 f) {return target null ? null : f.apply(target);
}public static T1, T2, T3 T3 applyNullCoalescing(T1 target,FunctionT1, T2 f1, FunctionT2, T3 f2) {return applyNullCoalescing(applyNullCoalescing(target, f1), f2);
}public static T1, T2, T3, T4 T4 applyNullCoalescing(T1 target,FunctionT1, T2 f1, FunctionT2, T3 f2,FunctionT3, T4 f3) {return applyNullCoalescing(applyNullCoalescing(target, f1, f2), f3);
}public static T1, T2, T3, T4, T5 T5 applyNullCoalescing(T1 target,FunctionT1, T2 f1, FunctionT2, T3 f2,FunctionT3, T4 f3, FunctionT4, 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海盗云商插件