Clojure的if-let允許您在實際評估函數之前調整函數返回的值的綁定。這可以讓你避免在兩次評估的功能(主要爲null檢查)Java的Clojure的if-let有Java的等價物嗎?
if (somMap.get(ky) != null){
String val = someMap.get(ky)
//do something }
有什麼樣的if-讓在Java中,可以讓你避免這種事情?
Clojure的if-let允許您在實際評估函數之前調整函數返回的值的綁定。這可以讓你避免在兩次評估的功能(主要爲null檢查)Java的Clojure的if-let有Java的等價物嗎?
if (somMap.get(ky) != null){
String val = someMap.get(ky)
//do something }
有什麼樣的if-讓在Java中,可以讓你避免這種事情?
等價嗎? - 不,if-let
條件宏是Conjure特有的。
不同的語言使用不同的結構,例如在數學我可以這樣寫:
g[x_] := 1 /; x > 0
g[x_] := -1 /; x <= 0
當條件在最後告訴然後函數定義是有效的。
Java不是功能性的語言。你可以在c#中做幾個不同的方面,但它支持?運算符,out和ref方法參數,惰性方法體等 - 而java不支持。
在Java中,您很可能會使用Google Guava庫(或Apache commons或...)和ImmutableMap。請注意,它禁止鑰匙能力爲null!
最好主要是爲了代碼的一致性和可維護性。
Java有一個空保存類型的概念,但它沒有強制執行。同樣的,Java可以在JDK10中有可以爲空的值類型,但是它目前沒有。
但是我想象正確的方式在Java中做,這是
String val = somMap.containsKey(ky) ? values.get(ky) : fallback;
,並沒有null鍵或值。如果您的FORCED處理空鍵或值,那麼只有這樣,我認爲添加空檢查是合理的。爲了保證程序將失敗,您可以使用
Preconditions.checkNotNull(val, "EOW | key [%s] has NULL value", val);
參考:谷歌番石榴Precontitions source。
Map<String, String> values = new HashMap<>();
String x;
if((x = values.get("key")) != null) {
System.out.println(x);
}
但我認爲這不太可讀比任何HireCore's評論答案
String x = values.get("key");
if(x != null) {
System.out.println(x);
}
或RealSKeptics/Tunakis可選/ getOrDefault。
沒有什麼不妥做
String val = someMap.get(key);
if (val != null) {
// do something
}
一個偶爾有用的替代方法是分配的條件的值。
String val;
if ((val = someMap.get(key)) != null) {
// do something with val
}
這需要val
必須事先聲明(你不能在條件申報val
),所以這個版本是在這種情況下,沒有比原來的更好。知道if
條件是否有另一部分是有用的技巧:
String val;
if (someMap != null && (val = someMap.get(key)) != null) {
// do something with val
}
'String val = someMap.get(ky);如果(val!= null){....}' - java不完全是一個功能豐富的語言,你知道...... –
我不熟悉Clojure,但也許是Java8構造'String val = Optional.ofNullable(someMap.get(ky))。orElse(「默認值」)'是你在找什麼? – RealSkeptic
@RealSkeptic可以更簡單地寫成'someMap.getOrDefault(ky,「Default value」)' – Tunaki