是否有一种有效且最少冗余的方法来有条件地将新项目放入地图。
GenericObject genericObject;
...
FieldObject obj = genericObject.getFieldObject();
if(obj == null) {
map.put("key1", null);
map.put("key2", null);
} else {
map.put("key1", obj.getField1());
map.put("key2", obj.getField2());
}
我能做的最好的是以下操作,但很好奇Java 9是否有更好的方法来完成上述操作。
boolean insert = obj != null;
map.put("key1", insert? obj.getField1() : null);
map.put("key2", insert? obj.getField2() : null);
您可以使用Optional
:
Optional<FieldObject> obj = Optional.ofNullable(genericObject.getFieldObject());
map.put("key1", obj.map(FieldObject::getField1).orElse(null));
map.put("key2", obj.map(FieldObject::getField2).orElse(null));
您不需要将null
放在Map
上。如果您未将非空值添加到指定键,则默认为null
,例如
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
System.out.println(map.get("test"));
}
}
输出:
null
所以,您可以做的最好的事情如下:
if(obj != null) {
map.put("key1", obj.getField1());
map.put("key2", obj.getField2());
}
如果要用null
覆盖值,一种有效的方法如下:
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) {
List<String> keys = List.of("key1", "key2", "key3", "key4");
Map<String, String> map = new HashMap<String, String>();
map.put("key1", "value1");
map.put("key2", "value2");
System.out.println("Before:");
for (String key : keys) {
System.out.println("Key: " + key + " Value: " + map.get(key));
}
Object obj = null;
if (obj == null) {
for (String key : map.keySet()) {
map.put(key, null);
}
}
System.out.println("After:");
for (String key : keys) {
System.out.println("Key: " + key + " Value: " + map.get(key));
}
}
}
输出:
Before:
Key: key1 Value: value1
Key: key2 Value: value2
Key: key3 Value: null
Key: key4 Value: null
After:
Key: key1 Value: null
Key: key2 Value: null
Key: key3 Value: null
Key: key4 Value: null
您可以对其进行如下重构:
GenericObject genericObject;
...
String value1=null,value2=null;
FieldObject obj = genericObject.getFieldObject();
if(obj != null) {
value1 = obj.getField1();
value2 = obj.getField2();
}
map.put("key1", value1);
map.put("key2", value2);
您可以通过添加以下两种方法将对null的检查委托给GenericObject:
public String getField1() {
return fieldObject == null ? null : fieldObject.getField1();
}
public String getField2() {
return fieldObject == null ? null : fieldObject.getField2();
}
然后
map.put("key1", genericObject.getField1());
map.put("key2", genericObject.getField2());