向HashMap有条件添加项目的有效方法

问题描述 投票:5回答:4

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

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);
java spring-boot optimization java-8 java-9
4个回答
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));

0
投票

您不需要将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

0
投票

您可以对其进行如下重构:

    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);

0
投票

您可以通过添加以下两种方法将对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());
© www.soinside.com 2019 - 2024. All rights reserved.