У меня есть блок кода, в котором я вызываю methodTwo, если methodOne возвращает null. Если methodTwo возвращает null, я вызываю methodThree
Optional<Workflow> optionalWorkflow = remoteWorkflowProvider.getWorkflow(request);
if (!optionalWorkflow.isPresent()) {
log.info("Cannot find workflow using remoteWorkflowProvider");
optionalWorkflow = featureBasedWorkflowProvider.getWorkflow(request);
}
if (!optionalWorkflow.isPresent()) {
log.info("Cannot find workflow using featureBasedWorkflowProvider");
optionalWorkflow = legacyWorkflowProvider.getWorkflow(request);
}
Есть ли лучший способ сделать это?
@Michael замечательный выбор, не отвечая, учитывая текущую тенденцию. Я бы предложил вам кофе.




Optional имеет несколько действительно мощных инструментов, которые не полагаются на if-then-else потоки. Посмотрите, например, функцию Optional.orElse, чтобы немного очистить свой код:
optionalWorkflow.orElse(featureBasedWorkflowProvider.getWorkflow(request))
Вы также можете использовать orElseGet для возврата лямбды, которая дает вам больше функциональности:
optionalWorkflow.orElseGet((value) -> {
log.info("Cannot find workflow using remoteWorkflowProvider");
return featureBasedWorkflowProvider.getWorkflow(request));
});
orElse также требует T, а не Supplier<Optional<T>>. Почему эта проверка типов?
Вы можете составить список провайдеров, а затем просмотреть их и сломать, если
optionalWorkflow.isPresent()