Clojure的if-let允许您在实际评估函数之前调整函数返回的值的绑定。这允许您避免两次评估函数(主要用于空值检查),如Java的
typedef boost::dynamic_bitset<unsigned char> DataType;
DataType bs(24, intValue);
bs.set(0, booleanValue);
在Java中是否有类似if-let的东西可以让你避免那种事情?
答案 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。