有条件地将项目添加到 HashMap 的有效方法

Man*_*att 5 java optimization spring-boot java-9

是否有一种有效且最少冗余的方法来有条件地将新项目放入地图中。

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());
}
Run Code Online (Sandbox Code Playgroud)

我能做的最好的是以下,但很好奇是否有更好的方法在 Java 9 中执行上述操作。

boolean insert = obj != null;
map.put("key1", insert? obj.getField1() : null);
map.put("key2", insert? obj.getField2() : null);
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 0

您可以使用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));
Run Code Online (Sandbox Code Playgroud)

  • “将其包装在可选中,然后将其展开为空” - 对我来说听起来不太好 (11认同)
  • 效率有不同的衡量标准。当“remove”也可以时,将“null”值放入映射中会浪费内存。所以 `FieldObject obj = genericObject.getFieldObject(); if(obj == null) { map.remove("key1"); 地图.put(“key2”); } else { map.put("key1", obj.getField1()); map.put("key2", obj.getField2()); }` 不会浪费内存,并且对实际的 `Map` 实现施加较少的限制,例如也可以与 `ConcurrentHashMap` 一起使用。 (3认同)