On Fri, Apr 17, 2015 at 03:01:29PM -0700, Steven Schlansker wrote:
> 
> On Apr 17, 2015, at 2:37 PM, Remi Forax <fo...@univ-mlv.fr> wrote:
> > As you can see the code is not bad but the code of chain() could be 
> > simplified
> > if there was a way on Optional to call a Supplier of Optional if an 
> > Optional is empty.
> > Currently, orElse() takes a value, orElseGet takes a lambda that will 
> > return a value
> > and there is no method that takes a lambda and return an Optional
> > (like flatMap but but with a supplier that will be called if the Optional 
> > is empty).
> > 
> > If we add the method orElseChain(Supplier<? extends Optional<T>> supplier)
> > perhaps with a better name ?, then the code of chain is better:
> > 
> >  public default TypeProvider chain(TypeProvider provider) {
> >    return name -> loadType(name).orElseChain(() -> provider.loadType(name));
> >  }
> > 
> > Am i the only one to think that this method is missing ?
> 
> We actually ran into the exact same problem, and wrote the following helper 
> method:
> 
> public static <X> Optional<X> unlessOpt(@Nonnull Optional<X> first, 
> Supplier<Optional<X>> second) {
>     return first.isPresent() ? first : second.get();
> }
> 
> I don't think it's precisely the same as your solution, but it definitely 
> indicates a missing method.

There are similar discussion here:
http://stackoverflow.com/questions/24599996/get-value-from-one-optional-or-another

and here:
http://stackoverflow.com/questions/28818506/java-8-optional-orelse-optional

-- Andreas

Reply via email to