作者:资深化妆师May | 来源:互联网 | 2023-02-05 09:03
我注意到,如果我执行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;
}
}
运行以下,
Map map = new HashMap();
Empl imp = new Empl("timon");
map.put("1", imp);
System.out.println(map.getOrDefault("1", new Empl("dumnba")));
给出这个输出:
timon
dumnba
timon0
仅当地图中没有默认对象时,才应该创建默认对象吗?如果没有,是什么原因?
1> Jon Skeet..:
仅当地图中没有默认对象时,才应该创建默认对象吗?
那怎么可能呢?这个电话:
map.getOrDefault("1", new Empl("dumnba"))
相当于:
String arg0 = "1";
Empl arg1 = new Empl("dumnba");
map.getOrDefault(arg0, arg1);
换句话说,所有参数在传递给方法之前都会被计算.
您可能会使用computeIfAbsent
,但如果密钥不存在,则会修改地图,您可能不需要:
System.out.println(map.computeIfAbsent("1", k -> new Empl("dumnba")));
2> khelwood..:
在执行函数之前,将评估函数的所有参数.Java需要进行评估,new Empl("dumnba")
以便将结果传递给getOrDefault
.之前无法知道的getOrDefault
是,其中一个参数不会被要求.
如果要提供除非需要而未计算的默认值,您可以使用computeIfAbsent
.为此,您传入一个函数,只有在需要默认值时才会执行该函数.
map.computeIfAbsent("1", key -> new Empl("dumnba"))