<div dir="ltr">Thanks Martin,<div>I now understand (documentation can be improved though - a one liner to explain what the method do instead referencing another place).</div><div><br></div><div>Going back to the essence.   I am interested in the following functionality : I do not care about "the other" future whether it is too late or exceptional. <br>
</div><div>The only way I can think about making it work as I expect is by  slowing down the exceptional flow and then cancelling it when all is done.</div><div><br></div><div><br></div><div><div>    static <T,U> CompletableFuture<U> myApplytoEither(CompletableFuture<T> f1, CompletableFuture<T> f2,Function<? super T, U> fn)  {</div>
<div>        CompletableFuture<T> f1be = f1.exceptionally((t) -> {sleep(100000);throw new RuntimeException(t);});</div><div>        CompletableFuture<T> f2be = f1.exceptionally((t) -> {sleep(100000);throw new RuntimeException(t);});</div>
<div>        CompletableFuture t = CompletableFuture.allOf(f1,f2).handle((res,trw)-> {f1be.cancel(true);f2be.cancel(true); return null;});</div><div>        return f1be.applyToEither(f2be,fn);</div><div>    }</div></div>
<div><br></div><div>I doubt that it really work probably there is some reason for it to be flawed:)<br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Apr 30, 2014 at 6:37 AM, Martin Buchholz <span dir="ltr"><<a href="mailto:martinrb@google.com" target="_blank">martinrb@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Haim,<div><br></div><div>The doc you cited also says,</div><div>See the CompletionStage documentation for rules covering exceptional completion.<br>
</div><div>which leads to:</div><div><br>
</div><div><div>Two method forms support processing whether the triggering stage completed normally or exceptionally: Method whenComplete allows injection of an action regardless of outcome, otherwise preserving the outcome in its completion. Method handle additionally allows the stage to compute a replacement result that may enable further processing by other dependent stages. In all other cases, if a stage's computation terminates abruptly with an (unchecked) exception or error, then all dependent stages requiring its completion complete exceptionally as well, with a CompletionException holding the exception as its cause. If a stage is dependent on both of two stages, and both complete exceptionally, then the CompletionException may correspond to either one of these exceptions. If a stage is dependent on either of two others, and only one of them completes exceptionally, no guarantees are made about whether the dependent stage completes normally or exceptionally. In the case of method whenComplete, when the supplied action itself encounters an exception, then the stage exceptionally completes with this exception if not already completed exceptionally.</div>

<div><br></div></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Apr 29, 2014 at 8:16 PM, Haim Yadid <span dir="ltr"><<a href="mailto:haim@performize-it.com" target="_blank">haim@performize-it.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div dir="ltr">Thanks Doug,<div><br></div><div>I find the documentation a bit confusing:</div>

<div><br></div><div><code style="font-family:'DejaVu Sans Mono',monospace;font-size:14px;padding-top:4px;margin-top:8px;line-height:1.4em;color:rgb(53,56,51);background-color:rgb(238,238,239)"><span style="font-weight:bold"><a href="http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html#applyToEither-java.util.concurrent.CompletionStage-java.util.function.Function-" style="text-decoration:none;color:rgb(74,103,130);padding-bottom:3px" target="_blank">applyToEither</a></span>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html" title="interface in java.util.concurrent" style="text-decoration:none;color:rgb(74,103,130);padding-bottom:3px;font-weight:bold" target="_blank">CompletionStage</a><? extends <a href="http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html" title="type parameter in CompletableFuture" style="text-decoration:none;color:rgb(74,103,130);padding-bottom:3px;font-weight:bold" target="_blank">T</a>> other, <a href="http://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html" title="interface in java.util.function" style="text-decoration:none;color:rgb(74,103,130);padding-bottom:3px;font-weight:bold" target="_blank">Function</a><? super <a href="http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html" title="type parameter in CompletableFuture" style="text-decoration:none;color:rgb(74,103,130);padding-bottom:3px;font-weight:bold" target="_blank">T</a>,U> fn)</code><span style="color:rgb(53,56,51);font-family:'DejaVu Sans',Arial,Helvetica,sans-serif;font-size:13px;line-height:18.200000762939453px;background-color:rgb(238,238,239)"></span><div style="margin:3px 10px 2px 0px;color:rgb(71,71,71);font-size:14px;font-family:'DejaVu Serif',Georgia,'Times New Roman',Times,serif;padding-top:0px;background-color:rgb(238,238,239)">



Returns a new CompletionStage that, when either this or the other given stage complete normally, is executed with the corresponding result as argument to the supplied function.</div></div><div style="margin:3px 10px 2px 0px;color:rgb(71,71,71);font-size:14px;font-family:'DejaVu Serif',Georgia,'Times New Roman',Times,serif;padding-top:0px;background-color:rgb(238,238,239)">



<br></div><div style="margin:3px 0px 2px 10px;color:rgb(71,71,71);font-size:14px;font-family:'DejaVu Serif',Georgia,'Times New Roman',Times,serif;padding-top:0px;background-color:rgb(238,238,239)">
In other places of the documentation (such as thenApply)  "completes normally" means successfully and not exceptionally.  </div><div style="margin:3px 0px 2px 10px;color:rgb(71,71,71);font-size:14px;font-family:'DejaVu Serif',Georgia,'Times New Roman',Times,serif;padding-top:0px;background-color:rgb(238,238,239)">



<br></div><div style="margin:3px 0px 2px 10px;color:rgb(71,71,71);font-size:14px;font-family:'DejaVu Serif',Georgia,'Times New Roman',Times,serif;padding-top:0px;background-color:rgb(238,238,239)">
In addition is there a way to do what I wanted to do in the first place ? Query several services pick up the fastest non erroneous answer. If all are exceptional pick one error.</div><div style="margin:3px 0px 2px 10px;color:rgb(71,71,71);font-size:14px;font-family:'DejaVu Serif',Georgia,'Times New Roman',Times,serif;padding-top:0px;background-color:rgb(238,238,239)">



I only need one successful </div><div style="margin:3px 0px 2px 10px;color:rgb(71,71,71);font-size:14px;font-family:'DejaVu Serif',Georgia,'Times New Roman',Times,serif;padding-top:0px;background-color:rgb(238,238,239)">



<br></div></div><div><div><div><div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Apr 30, 2014 at 3:12 AM, Doug Lea <span dir="ltr"><<a href="mailto:dl@cs.oswego.edu" target="_blank">dl@cs.oswego.edu</a>></span> wrote:<br>



<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>On 04/29/2014 04:03 PM, Haim Yadid wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Hi,<br>
Take a look on the following code snippet.<br>
Two CompletableFutures f1 returns 42 f2 throws exception.<br>
If f2 ends before f1 an exception will be thrown on f3.get() .<br>
As f1 is the only future which completes normally I would expect that it will<br>
wait for f1 to complete and return its result. What am I missing?<br>
</blockquote>
<br></div>
A CompletableFuture is complete when its action either returns or throws<br>
an exception. If exceptional, then the exception is propagated<br>
to dependents. There are several CompletableFuture methods for handling<br>
and transforming exceptional outcomes.<div><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
         CompletableFuture<Integer> f1 = supplyAsync(<br>
                 () -> {sleep(2300);return 42;});<br>
         CompletableFuture<Integer> f2 = supplyAsync(<br>
                 () -> {sleep(2200);if (true) throw new<br>
RuntimeException();return 43;});<br>
<br>
         CompletableFuture<Integer> f3 = f1.applyToEither(f2,(r) -> r * r);<br>
<br>
         System.out.println(f3.get());<br>
</blockquote>
<br></div>
This should print an exception.<br>
<br>
-Doug<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>
<br>
<br>
PS - sleep is a Thread.sleep() wrapper when swallows check exceptions and throws<br>
runtime exception instead.<br>
<br>
<br>
<br>
--<br>
Haim Yadid | Performization Expert<br>
Performize-IT | t <a href="tel:%2B972-54-7777132" value="+972547777132" target="_blank">+972-54-7777132</a><br>
</div><a href="http://www.performize-it.com" target="_blank">www.performize-it.com</a> <<a href="http://www.performize-it.com" target="_blank">http://www.performize-it.com</a>><br>
<br>
<br>
______________________________<u></u>_________________<br>
Concurrency-interest mailing list<br>
<a href="mailto:Concurrency-interest@cs.oswego.edu" target="_blank">Concurrency-interest@cs.<u></u>oswego.edu</a><br>
<a href="http://cs.oswego.edu/mailman/listinfo/concurrency-interest" target="_blank">http://cs.oswego.edu/mailman/<u></u>listinfo/concurrency-interest</a><br>
<br>
</blockquote>
<br>
______________________________<u></u>_________________<br>
Concurrency-interest mailing list<br>
<a href="mailto:Concurrency-interest@cs.oswego.edu" target="_blank">Concurrency-interest@cs.<u></u>oswego.edu</a><br>
<a href="http://cs.oswego.edu/mailman/listinfo/concurrency-interest" target="_blank">http://cs.oswego.edu/mailman/<u></u>listinfo/concurrency-interest</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr">Haim Yadid | Performization Expert <div>Performize-IT | t <a href="tel:%2B972-54-7777132" value="+972547777132" target="_blank">+972-54-7777132</a><br>


<a href="http://www.performize-it.com" target="_blank">www.performize-it.com</a></div>
</div>
</div>
</div></div></div></div></div><div><div><br><br clear="all"><div><br></div>-- <br><div dir="ltr">Haim Yadid | Performization Expert <div>Performize-IT | t <a href="tel:%2B972-54-7777132" value="+972547777132" target="_blank">+972-54-7777132</a><br>

<a href="http://www.performize-it.com" target="_blank">www.performize-it.com</a></div>
</div>
</div></div></div>
<br>_______________________________________________<br>
Concurrency-interest mailing list<br>
<a href="mailto:Concurrency-interest@cs.oswego.edu" target="_blank">Concurrency-interest@cs.oswego.edu</a><br>
<a href="http://cs.oswego.edu/mailman/listinfo/concurrency-interest" target="_blank">http://cs.oswego.edu/mailman/listinfo/concurrency-interest</a><br>
<br></blockquote></div><br></div>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr">Haim Yadid | Performization Expert <div>Performize-IT | t +972-54-7777132<br><a href="http://www.performize-it.com" target="_blank">www.performize-it.com</a></div>
</div>
</div>