src/main/java/io/reactivex/Single.java
@CheckReturnValue
    @NonNull
    @SchedulerSupport(SchedulerSupport.NONE)
    @Experimental
    public final <R> Maybe<R> dematerialize(Function<? super T, Notification<R>> selector) {
        ObjectHelper.requireNonNull(selector, "selector is null");
        return RxJavaPlugins.onAssembly(new SingleDematerialize<T, R>(this, selector));
    }
@CheckReturnValue
    @NonNull
    @SchedulerSupport(SchedulerSupport.NONE)
    @Experimental
    public final <R> Maybe<R> dematerialize(Function<? super T, Notification<R>> selector) {
        ObjectHelper.requireNonNull(selector, "selector is null");
        return RxJavaPlugins.onAssembly(new SingleDematerialize<T, R>(this, selector));
    }
Maps the {@link Notification} success value of this Single back into normal
{@code onSuccess}, {@code onError} or {@code onComplete} signals as a
{@link Maybe} source.
<p>
The intended use of the {@code selector} function is to perform a
type-safe identity mapping (see example) on a source that is already of type
{@code Notification<T>}. The Java language doesn't allow
limiting instance methods to a certain generic argument shape, therefore,
a function is used to ensure the conversion remains type safe.
<dl>
<dt><b>Scheduler:</b></dt>
<dd>{@code dematerialize} does not operate by default on a particular {@link Scheduler}.</dd>
</dl>
<p>
Example:
<pre><code>
Single.just(Notification.createOnNext(1))
.dematerialize(notification -&gt; notification)
.test()
.assertResult(1);
</code></pre>
@param <R> the result type
@param selector the function called with the success item and should
return a {@link Notification} instance.
@return the new Maybe instance
@since 2.2.4 - experimental
@see #materialize()