What's the difference between rxjava2's Maybe and Optional?
Maybe
is a wrapper around an operation/event that may have either
- A single result
- No result
- Error result
However Optional is a wrapper around a value that may either be
- Present
- Absent
In your example, in the map
operation, the computation is synchronous (i.e. 6/i
is synchronous and can result in a value immediately) and you want to propagate a value (if division is possible) or empty value (if division is not possible). Hence using Optional
makes more sense.
There are however other options also:
- If you want to propagate why division is not possible then you would want to report the exception that occurred. In such a case using
Maybe
will make more sense. If you are not interested in both empty value and reason of error, then you simply want to skip propagating those results. In such a scenario I would use a
flatMap
instead ofmap
. I will then not have to use any ofOptional
orMaybe
..flatMap(i -> { try { int result = 6 / i; return Observable.just(result); } catch (Exception e) { return Observable.empty(); } })
Maybe
is also useful when you have an Observable
that can emit multiple values but you are interested in, let's say, only the first one and hence you use the firstElement()
operator on the Observable. This returns a Maybe because either there is a single value, or there is no value (if source Observable does not emit any value before completing) or there is an error (if source Observable errors before emitting any value).
Maybe
is a lazy stream of zero or one things (and being a stream can result in an error). Optional
is not lazy, it it is either present or absent. There is no sense of deferred calculation with an Optional
whereas there is with Maybe
.
The difference relevant to your question is that Maybe
can propagate error while Optional
cannot - in your example one cannot distinguish between error and empty result. If error handling is important, Optional
is useless, while Maybe
has Maybe.error(Throwable)
. API-wise, for your use case I would prefer Single
to Maybe
- because it yields either Error or single Result, so return type would be Observable<Single<T>>