在Python中,我可以执行以下操作:
d = { 'a': True, 'b': False }
print d.get('x', True)
会打印
True
在Java中,HashMap.get
方法没有用于指定默认值的第二个参数。实现这一目标的正确,简洁和可读的方法是什么?以下表达式对我来说似乎太多了:
map.containsKey("x") ? map.get("x") : true
答案 0 :(得分:6)
你应该使用
map.containsKey("x")
而不是
map.get("x") != null
测试map是否有key的映射。
地图可以在映射中包含null作为有效值。
python也是如此。仅测试dict [key] == None是否足以知道某个键是否映射到某个东西是不够的。
快速测试:
d = {'a': None}
# returns True
d['a'] == None
# raises KeyError
d['b']
# returns 'Whatever'
d.get('b', 'Whatever')
因此java等效于python dict.get()是
map.containsKey("x") ? map.get("x") : default_value
如OP所说
答案 1 :(得分:2)
我认为......
Object o = map.get("x");
if(o == null)
o = BOOLEAN.TRUE;
...几乎是最可读和最有效的方法。你只是这样做一次地图查找。不幸的是,“Java”和“简洁”并不倾向于适用于同一句话,除非它是否定的。
答案 2 :(得分:1)
两者都是有效的解决方案(虽然引入一个局部变量可能会更好......性能更好)但是在代码中到处都这样做并不是一个好主意。考虑为HashMap
编写一个适配器,为您提供一个允许您指定默认值的新get()
方法。这是增强课程功能的最佳方式。
答案 3 :(得分:0)
map.get("x") == null ? true : map.get("x")
这听起来不错但是如果你需要它,你可以实现自己的实现来处理get()
itlself
答案 4 :(得分:0)
我会扩展地图以显示get(String key, Boolean defaultValue)
...如果不是,我至少将三元组放入方法中,将get.("x")
的结果推入堆栈,而不是获取它两次......像IfNull(map.get("x"), True)
如果你需要提供默认值,你可能无论如何都要对地图进行“专门”使用,因此我想包装类将是要走的路,不仅仅是为了这种行为,而是对于任何其他行为(当前和未来) )专门的行为/责任。
这就是我如何处理它...我不是面向对象的设计大师; - )
干杯。基思。
答案 5 :(得分:0)
两者都错了,因为他们会进行2次查找。 通常你会想做:
Boolean ret = map.get("x");
if (ret == null) {
return true
}
return ret;
您可以将其包装在函数
中public static <K,V> V mapGet(Map<K, V> map, K key, V defaultValue) {
V ret = map.get(key);
if (ret == null) {
return defaultValue;
}
return ret;
}
如果需要,可以将其设为非静态。如果您是实例化地图对象的人(您没有从外部代码获取它),您可以继承hashmap。如果API返回map实例,那么您就不能使用子类化。
public class MyHashMap<K,V> extends HashMap<K,V> {
public V get(K key, V default) {
V ret = get(key);
if (ret == null) {
return defaultValue;
}
return ret;
}
}
答案 6 :(得分:0)
一个简短且相当通用的方法,虽然不一定是好的做法,但它将是一个帮助类和一个静态导入:
Helper.java
package vlad;
import java.util.Map;
public class Helper{
public static <K,V> V get(Map<K,V> m, K key, V def){
V v = m.get(key);
return (v!=null) ? v : def;
}
}
Test.java
import java.util.*;
import static vlad.Helper.get;
class Test{
public static void main(String[]args){
Map<String, Integer> m = new HashMap<String,Integer>();
m.put("forty-two", 42);
m.put("three", 3);
m.put("one", 1);
System.out.println(get(m,"forty-two",-1));
System.out.println(get(m,"three",-1));
System.out.println(get(m,"one",-1));
System.out.println(get(m,"something_else",-1));
}
}
答案 7 :(得分:0)
在Java 8中,Map上有一个getOrDefault
方法,它应该像Python的dict
s'get
方法一样:https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#getOrDefault-java.lang.Object-V-。