code: public static <T1, T2, R> Optional<R> zip(final Optional<? extends T1> f, final Iterable<? extends T2> v,
              final BiFunction<? super T1, ? super T2, ? extends R> fn) {
          return narrow(Option.fromOptional(f)
                             .zip(v, fn)
                             .toOptional());
      }
docs: Combine an Optional with the provided Iterable (selecting one element if present) using the supplied BiFunction
  <pre>
  {@code
  Optionals.zip(Optional.of(10),Arrays.asList(20), this::add)
  //Optional[30]
  
  private int add(int a, int b) {
  return a + b;
  }
  
  }
  </pre>
  @param f Optional to combine with first element in Iterable (if present)
  @param v Iterable to combine
  @param fn Combining function
  @return Optional combined with supplied Iterable, or zero Optional if no value present