Доступ к внутреннему полю json с необязательной проверкой null

#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, но я не понимал, что я мог бы использовать в этом случае. Иногда я усложняю некоторые простые вещи. Спасибо за вашу помощь