Вот несколько обсуждений , которые я имел ранее в этой теме.
Я сделал интерфейс Result
по рассуждениям. A Result
является либо успешным со значением типа T
, либо неудачей с Исключением. Это подтип Async
, как немедленное завершение асинхронного действия, но это не важно здесь.
Чтобы создать результат -
Result.success( value )
Result.failure( exception )
Result.call( callable )
Результат может быть преобразован различными способами - transform, map, then, peek, catch_, finally_
и т. д. Например
Async rInt = Result.success( s )
.map( Integer::parseInt )
.peek( System.out::println )
.catch_( NumberFormatException.class, ex->42 ) // default
.catch_( Exception.class, ex-> { ex.printStacktrace(); throw ex; } )
.finally_( ()->{...} )
К сожалению, API фокусируется на Async, поэтому некоторые методы возвращают Async. Некоторые из них могут быть переопределены Результатом, чтобы вернуть результат; но некоторые не могут, например. then()
(это плоская карта). Однако, если интересно, легко извлечь автономный API результатов, который не имеет никакого отношения к Async.