是否有Java等同于Clojure的if-let?

时间:2015-11-03 15:48:52

标签: java clojure null

Clojure的if-let允许您在实际评估函数之前调整函数返回的值的绑定。这允许您避免两次评估函数(主要用于空值检查),如Java的

typedef boost::dynamic_bitset<unsigned char> DataType;
DataType bs(24, intValue);
bs.set(0, booleanValue);

在Java中是否有类似if-let的东西可以让你避免那种事情?

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:2)

等价? - 不,if-let条件宏对于Conjure来说是唯一的。

不同的语言使用不同的结构,例如在Mathematica中我可以写:

g[x_] := 1 /; x > 0
g[x_] := -1 /; x <= 0

最后的条件告诉那么函数定义是有效的。

Java不是函数式语言。你可以在c#中做几个不同的方面,但它支持?? operator,out和ref方法参数,惰性方法体等等 - 而java则没有。

在Java中,您最有可能使用Google Guava库(或Apache commons或......)和ImmutableMap。请注意,它不允许关键能力为 null

  

主要是为了代码的一致性和可维护性。

Java有一个null保存类型的概念,但它没有强制执行。类似地,Java可以在JDK10中具有可为空的值类型,但它当前没有它。

但是我想在Java中这样做的正确方法是

String val = somMap.containsKey(ky) ? values.get(ky) : fallback;

并且没有null键或值。如果你的FORCED处理空键或值然后我认为添加空检查是合理的。要确保程序失败,您可以使用

Preconditions.checkNotNull(val, "EOW | key [%s] has NULL value", val );

参考:Google番石榴Precontitions source

答案 2 :(得分: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。