Есть ли чистый (и нулевой безопасный) способ умножения значений карты в Java? - PullRequest
0 голосов
/ 17 октября 2018

У меня есть Map<String, Double>, и я хочу умножить все значения на карте, скажем, на 2, но сохранить нулевые значения как нулевые.

Я, очевидно, могу использовать цикл for для этого, но мне было интересно, есть ли более чистый способ сделать это?

Map<String, Double> someMap = someMapFunction();
Map<String, Double> adjustedMap = new Hashmap<>();
if (someMap != null) {
    for (Map.Entry<String,Double> pair : someMap.entryset()) {
        if (pair.getValue() == null) {
            adjustedMap.put(pair.getKey(), pair.getValue());
        } else {
            adjustedMap.put(pair.getKey(), pair.getValue()*2)
        }

    }
}

Также иногда карта, возвращаемая someMapFunction, являетсянеизменяемая карта, поэтому это не может быть сделано на месте с помощью Map.replaceAll.Я не мог придумать потоковое решение, которое было бы чище.

Ответы [ 12 ]

0 голосов
/ 17 октября 2018

Вы можете достичь этого, преобразовав в поток что-то вроде:

someMap.entrySet()
        .forEach(entry -> {
            if (entry.getValue() != null) {
                adjustedMap.put(entry.getKey(), someMap.get(entry.getKey()) * 2);
            } else {
                adjustedMap.put(entry.getKey(), null);
            }
        });

, которое можно сократить до:

someMap.forEach((key, value) -> {
    if (value != null) {
        adjustedMap.put(key, value * 2);
    } else {
        adjustedMap.put(key, null);
    }
});

Итак, если у вас есть карта с:

Map<String, Double> someMap = new HashMap<>();
someMap.put("test1", 1d);
someMap.put("test2", 2d);
someMap.put("test3", 3d);
someMap.put("testNull", null);
someMap.put("test4", 4d);

Вы получите этот вывод:

{test4=8.0, test2=4.0, test3=6.0, testNull=null, test1=2.0}
0 голосов
/ 17 октября 2018

Моим первым инстинктом было предложить Stream ввода Map 'entrySet, который отображает значения на новые значения и оканчивается на collectors.toMap().

К сожалению, Collectors.toMap throwsNullPointerException когда функция отображения значений возвращает null.Поэтому он не работает со значениями null вашего ввода Map.

В качестве альтернативы, поскольку вы не можете изменить свой вход Map, я предлагаю создать его копиюа затем позвоните replaceAll:

Map<String, Double> adjustedMap = new HashMap<>(someMap);
adjustedMap.replaceAll ((k,v) -> v != null ? 2*v : null);
...