public static <T1, T2, R> Optional<R> zip(final Publisher<? extends T2> p, final Optional<? extends T1> f,
            final BiFunction<? super T1, ? super T2, ? extends R> fn) {
        return narrow(Maybe.fromOptional(f)
                           .zip(fn, p)
                           .toOptional());
    }
public static < T1 , T2 , R > Optional < R > zip ( final Publisher < ? extends T2 > p , final Optional < ? extends T1 > f , final BiFunction < ? super T1 , ? super T2 , ? extends R > fn ) { return narrow ( Maybe . fromOptional ( f ) . zip ( fn , p ) . toOptional ( ) ) ; }
Combine an Optional with the provided Publisher (selecting one element if present) using the supplied BiFunction
<pre>
{@code
Optionals.zip(Flux.just(10),Optional.of(10), this::add)
//Optional[30]

private int add(int a, int b) {
return a + b;
}

}
</pre>

@param p Publisher to combine
@param f  Optional to combine with
@param fn Combining function
@return Optional combined with supplied Publisher, or zero Optional if no value present