Я пытаюсь выяснить, каковы идиоматические способы использования VAVR Try.
Вариант использования, на который я смотрю, состоит из следующих шагов:
- получить список ботинок (вызов может выдать проверенное исключение)
- очистить каждый ботинок (вызов может выдать проверенное исключение)
- восстановить каждую обувь (вызов может выдать проверенное исключение)
- вернуть список очищенной / восстановленной обуви
Вот мой пример игрушечного кода, где метод processRequest покупает n пар обуви, очищает и восстанавливает их; выдает ошибки, если они есть:
// definitions
ShoeStore java.util.List<Shoe> buy(int numberOfPairs) throws OutOfStockException;
ShoeCleaningService Shoe clean(Shoe dirtyShoe) throws OutOfShoePolishException;
ShoeRestoreService Shoe restore(Shoe oldShoe) throws OutOfSparePartsException;
class EnterpriseShoeService {
// constructor
...
public List<Shoe> processRequest(int numberOfPairs) {
Try<List<Shoe>> shoes = Try.of(() -> shoeStore.buy(numberOfPairs));
Try<List<Try<Shoe>>> cleanedAndRestoredShoes = shoes.map(xs -> xs.stream().map(shoe ->
Try.success(shoe)
.andThenTry(shoeCleaningService::clean)
.andThenTry(shoeRestoreService::restore))
.collect(Collectors.toList()));
List<Shoe> result = cleanedAndRestoredShoes
.getOrElseGet(err -> {
System.out.println(err.getMessage());
return Collections.emptyList();
})
.stream()
.map(shoeTry -> shoeTry.onFailure(err -> System.out.println(err.getMessage())))
.filter(Try::isSuccess)
.map(Try::get)
.collect(Collectors.toList());
return result;
}
}
Мой вопрос: как можно упростить эту логику? Есть ли какие-либо вызовы методов, которые могут быть устранены? можно ли улучшить читаемость?