Если поле отсутствует, вы в конечном итоге присваиваете Optional.empty()
переменной fieldValue
.
Object fieldValue = objectMap.entrySet().stream()
.filter(fieldDescriptorObjectEntry -> {
Descriptors.FieldDescriptor descriptor = fieldDescriptorObjectEntry.getKey();
return descriptor.getName().equals(fieldName);
})
.findFirst().map(fieldDescriptorObjectEntry -> fieldDescriptorObjectEntry.getValue())
.orElse(Optional.empty()); // ISSUE HERE
Затем вы возвращаетесь с return Optional.of(fieldValue)
.Это означает, что когда поле не найдено, вы возвращаете Optional<Optional<?>>
, поэтому при выполнении следующих действий:
long someUid = (long) getRequestByFieldName("some_uid").orElse(0);
Бит orElse
равен , никогда вызывается, поскольку Optional
никогда не пустоВместо этого он содержит Optional
, который явно не может быть приведен к Long
.Из вашего кода вы сможете просто вернуть результат map
, например, так:
return objectMap.entrySet().stream()
.filter(fieldDescriptorObjectEntry -> {
Descriptors.FieldDescriptor descriptor = fieldDescriptorObjectEntry.getKey();
return descriptor.getName().equals(fieldName);
})
.findFirst()
.map(fieldDescriptorObjectEntry -> fieldDescriptorObjectEntry.getValue());
То, полностью ли это решает проблему приведения, зависит от того, как вы определяете, какой тип объекта Optional
держит.