java.util.Map';什么是getOrDefault()工作?
我注意到,如果我使用map.getOrDefault(“key1”,new Object()),即使映射中的java.util.Map';什么是getOrDefault()工作?,java,Java,我注意到,如果我使用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
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<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")));
默认对象不应该仅在地图中不存在时创建吗?如果不是,原因是什么?这不是因为映射的实现方式,而是因为Java的工作方式。运行时解释器必须首先创建对象(newemp
part),然后才能实际调用该方法(getOrDefaultpart)
默认对象不应该仅在地图中不存在时创建吗
怎么会是这样?此电话:
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")));
查看java 8实现:
default V getOrDefault(Object key, V defaultValue) {
V v;
return (((v = get(key)) != null) || containsKey(key))
? v
: defaultValue;
}
该文件规定:
返回指定键映射到的值,或
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"));
Map Map=newhashmap();
地图放置(“1”、“Foo”);
//搜索key==1的条目,因为存在,所以返回foo
System.out.println(map.getOrDefault(“1”,“dumnba”);
//搜索key==2的条目,因为不存在,所以返回dumna
System.out.println(map.getOrDefault(“2”,“dumnba”);
函数的所有参数都在函数执行之前进行求值。Java需要评估newemp(“dumnba”)
,以便将结果传递到getOrDefault
。在调用getOrDefault
之前,它无法知道其中一个参数不是必需的
map.computeIfAbsent("1", key -> new Empl("dumnba"))
如果要提供除非需要否则不会计算的默认值,可以使用。为此,您传入一个函数,并且仅当需要默认值时才执行该函数
map.computeIfAbsent("1", key -> new Empl("dumnba"))
自Java 8以来,如果要避免计算默认参数,可以使用Optional的OrelGet方法:
System.out.println(Optional.ofNullable(map.get("1"))
.orElseGet(() -> new Empl("dumnba")));
如果找到键“1”,OrelGet将返回相应的映射值。否则,它将返回对传递的函数求值的结果。只有在找不到键的情况下,才会对其求值(并实例化类emp)
当然,当找到键时,这将始终实例化可选项。是否检查了源代码?(我认为在调用之前不执行new是不可能的)您正在将默认对象传递到getOrDefault方法中。您通过编写new emp(“dumnba”)
来创建它。在第一个代码块的第三行中,第二个复选框-containsKey(key)
是多余的。不是吗?如果get(key)!=null
很明显containsKey(key)
(containsKey(key)
返回null
,当Map
中没有这样的key,或者Map
中通过该键有null
时)