Эффективный способ условного добавления элементов в HashMap - PullRequest
5 голосов
/ 04 марта 2020

Существует ли эффективный и наименее избыточный способ условного размещения новых элементов на карте.

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

Ответы [ 4 ]

0 голосов
/ 04 марта 2020

Положить ноль в качестве значения для карты, это довольно странно.

map.put("key", null);
map.get("key"); // -- is it null because no such key or because the value is null?

Итак, нет необходимости добавлять нули, которые вы можете просто использовать, необязательно

Optional.ofNullable(obj).ifPresent(v -> {
   map.put("key1", obj.getField1());
   map.put("key2", obj.getField2());
});

Но ваше простое if -статирование более читабельно

0 голосов
/ 04 марта 2020

Вам не нужно ставить 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 голосов
/ 04 марта 2020

Вы можете делегировать проверку на нулевое значение для GenericObject, добавив к нему следующие 2 метода:

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());
0 голосов
/ 04 марта 2020

Вы можете использовать Optional s:

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