#java-8 #jackson #optional
#java-8 #джексон #необязательно
Вопрос:
У меня есть json, подобный этому:
{
"name": "car",
"attributes": {
"lon": 13,
"lat": 15
}
}
Иногда некоторые атрибуты могут быть нулевыми.
Optional<Attributes> op = Optional.ofNullable(json);
if (op.isPresent()) {
Optional<Integer> opI = Optional.ofNullable(op.get().getLon());
opI.ifPresent(....);
}
Как избежать использования Optional во многих строках, есть ли безопасный способ уменьшить его. Представьте, что у вас есть такой json.
{"object1": {
"object2": {
"object3": {
"object4: {
и вам нужно получить доступ к object4, но проверить, являются ли некоторые из предыдущих объектов null, с моим подходом, использующим optional . Это было бы не лучшим и более элегантным решением.
Что я могу сделать элегантным способом, используя необязательный и сокращая код?
Ответ №1:
Вы просто используете Optional.map
, который пропускает код, который вы ему даете, когда необязательный параметр пуст
Integer lon = Optional.ofNullable(json).map(Attributes::getLon).orElse(null);
Вы можете связать любое количество промежуточных map()
вызовов с последовательными опциями. map()
пропустит вызов функции, которую вы ей предоставляете, если необязательный параметр пуст.
Итак, для вашего другого случая:
var object4 = Optional.ofNullable(mainObject)
.map(MainObject::getObject1)
.map(Object1:getObject2)
.map(Object2:getObject3)
.map(Object3:getObject4)
.orElse(null); //set object4 to null if anything was missing
Важно иметь в виду (из связанных JavaDocs):
Если значение присутствует, примените к нему предоставленную функцию сопоставления, и если результат не равен нулю, верните необязательное значение, описывающее результат. В противном случае верните пустое необязательное значение.
Поэтому, если any getObjectN
возвращает null, результирующее необязательное значение будет пустым.
Комментарии:
1. Отлично, я знал map, но я не понимал, что я мог бы использовать в этом случае. Иногда я усложняю некоторые простые вещи. Спасибо за вашу помощь