В приложении Spring я стремлюсь получить тело запроса в методе контроллера и хочу быстро передать его через несколько вызовов методов (по пути возвращая различные типы), например, в следующем (упрощенном) примере:
public ResponseEntity<FooDto> postFoo(@RequestBody final FooDto requestBody) {
return Optional.of(requestBody) // Optional<FooDto>
.map(mapper::fromDto) // Optional<FooEntity>
.map(service::insertEntity) // Optional<FooEntity>
.map(mapper::fromEntity) // Optional<FooDto>
.map(dto -> ResponseEntity.created(/* ... */).body(dto).build()) // Optional<ResponseEntity<FooDto>>
.orElseThrow(IllegalStateException::new);
}
Как вы можете видеть, я испытываю желание применить некоторые шаблоны FP, но класс Optional на самом деле не подходит для этого, поскольку подразумеваемая "необязательность" является искусственной, и основной объект интереса никогда не должен быть пустым в первом место. Таким образом, окончательное исключение (надеюсь) никогда не будет выдано, и в качестве альтернативы просто вызов Optional::get
не очень хороший вариант, так как Sonarlint жалуется на непроверенный вызов get и вполне справедливо.
Есть ли идиоматизм c способ, возможно, даже в сочетании с vavr или другими библиотеками FP, для express такой цепочки методов лучше, чем с такими искусственными необязательными конструкциями? В противном случае мне, возможно, придется воздержаться от этого и вернуться к классическому c императивному подходу с дюжиной переменных.
РЕДАКТИРОВАТЬ: способ, которым я пытаюсь использовать Optional, легко выходит из-под контроля при работе с методами это возвращение Either<ErrorReason, Optional<FooEntity>>
, что делает Optional<Either<ErrorReason, Optional<FooEntity>>>
более не читаемым.