我注意到,如果我执行map.getOrDefault("key1",new Object()),即使key1在地图中存在对象,new Object()也会创建.虽然它不是由方法返回但它仍然创建它.例如,
public class Empl {
private int id;
private String name;
public Empl(String name) {
// TODO Auto-generated constructor stub
System.out.println(name);
this.name = name;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return name+id;
}
}
Run Code Online (Sandbox Code Playgroud)
运行以下,
Map<String, Empl> map = new HashMap<String, Empl>();
Empl imp = new Empl("timon");
map.put("1", imp);
System.out.println(map.getOrDefault("1", new Empl("dumnba")));
Run Code Online (Sandbox Code Playgroud)
给出这个输出:
timon
dumnba
timon0
Run Code Online (Sandbox Code Playgroud)
仅当地图中没有默认对象时,才应该创建默认对象吗?如果没有,是什么原因?
Jon*_*eet 21
仅当地图中没有默认对象时,才应该创建默认对象吗?
那怎么可能呢?这个电话:
map.getOrDefault("1", new Empl("dumnba"))
Run Code Online (Sandbox Code Playgroud)
相当于:
String arg0 = "1";
Empl arg1 = new Empl("dumnba");
map.getOrDefault(arg0, arg1);
Run Code Online (Sandbox Code Playgroud)
换句话说,所有参数在传递给方法之前都会被计算.
您可能会使用computeIfAbsent,但如果密钥不存在,则会修改地图,您可能不需要:
System.out.println(map.computeIfAbsent("1", k -> new Empl("dumnba")));
Run Code Online (Sandbox Code Playgroud)
查看 java 8 实现:
default V getOrDefault(Object key, V defaultValue) {
V v;
return (((v = get(key)) != null) || containsKey(key))
? v
: defaultValue;
}
Run Code Online (Sandbox Code Playgroud)
该文档指定:
返回指定键映射到的值,如果此映射不包含键的映射,则返回 defaultValue。奥特
它将返回地图中不存在的默认值
例子:
Map<String, String> map = new HashMap<>();
map.put("1", "Foo");
//search for the entry with key==1, since present, returns foo
System.out.println(map.getOrDefault("1", "dumnba"));
//search for the entry with key==2, since not present, returns dumnba
System.out.println(map.getOrDefault("2", "dumnba"));
Run Code Online (Sandbox Code Playgroud)
在执行函数之前,将评估函数的所有参数.Java需要进行评估,new Empl("dumnba")以便将结果传递给getOrDefault.之前无法知道的getOrDefault是,其中一个参数不会被要求.
如果要提供除非需要而未计算的默认值,您可以使用computeIfAbsent.为此,您传入一个函数,只有在需要默认值时才会执行该函数.
map.computeIfAbsent("1", key -> new Empl("dumnba"))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26930 次 |
| 最近记录: |