Там уже много ответов.Некоторые из них кажутся мне немного сомнительными.В любом случае, большинство из них встраивают null
-проверку в одной или другой форме.
Подход, который делает один шаг вверх по лестнице абстракции, следующий:
Вы хотитеприменить унарный оператор к значениям карты.Таким образом, вы можете реализовать метод, который применяет унарный оператор к значениям карты.(Все идет нормально).Теперь вам нужен «специальный» унарный оператор, который является null
-безопасным.Затем вы можете обернуть null
-защищенный унарный оператор вокруг исходного.
Это показано здесь, с тремя различными операторами (один из них Math::sin
, в этом отношении):
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.function.UnaryOperator;
public class MapValueOps
{
public static void main(String[] args)
{
Map<String, Double> map = new LinkedHashMap<String, Double>();
map.put("A", 1.2);
map.put("B", 2.3);
map.put("C", null);
map.put("D", 4.5);
Map<String, Double> resultA = apply(map, nullSafe(d -> d * 2));
System.out.println(resultA);
Map<String, Double> resultB = apply(map, nullSafe(d -> d + 2));
System.out.println(resultB);
Map<String, Double> resultC = apply(map, nullSafe(Math::sin));
System.out.println(resultC);
}
private static <T> UnaryOperator<T> nullSafe(UnaryOperator<T> op)
{
return t -> (t == null ? t : op.apply(t));
}
private static <K> Map<K, Double> apply(
Map<K, Double> map, UnaryOperator<Double> op)
{
Map<K, Double> result = new LinkedHashMap<K, Double>();
for (Entry<K, Double> entry : map.entrySet())
{
result.put(entry.getKey(), op.apply(entry.getValue()));
}
return result;
}
}
Я думаю, что это чисто, потому что это хорошо разделяет проблемыприменения оператора и выполнения проверки null
.И это null
-безопасно, потому что ... имя метода говорит об этом.
(Можно поспорить, чтобы перетащить вызов, чтобы заключить оператора в nullSafe
один в метод apply
, но здесь дело не в этом)
Редактировать:
В зависимости от предполагаемого шаблона приложения, можно сделать что-то подобное и применить преобразование на месте , без создания новой карты, позвонив по номеру Map#replaceAll