推销自己的海盗猫王运营商
因此,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
總結
以上是生活随笔為你收集整理的推销自己的海盗猫王运营商的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 个人辞职原因简短实用(普通员工辞职报告分
- 下一篇: 路由器上网怎么设置带路由器如何设置网络
