2015-11-03 77 views
0

Clojure的if-let允許您在實際評估函數之前調整函數返回的值的綁定。這可以讓你避免在兩次評估的功能(主要爲null檢查)Java的Clojure的if-let有Java的等價物嗎?

if (somMap.get(ky) != null){ 
     String val = someMap.get(ky) 
     //do something } 

有什麼樣的if-讓在Java中,可以讓你避免這種事情?

+2

'String val = someMap.get(ky);如果(val!= null){....}' - java不完全是一個功能豐富的語言,你知道...... –

+0

我不熟悉Clojure,但也許是Java8構造'String val = Optional.ofNullable(someMap.get(ky))。orElse(「默認值」)'是你在找什麼? – RealSkeptic

+0

@RealSkeptic可以更簡單地寫成'someMap.getOrDefault(ky,「Default value」)' – Tunaki

回答

2

等價嗎? - 不,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

0
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。

2

沒有什麼不妥做

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 
} 
相關問題