I'm having trouble returning car price value using getPrice()
method because of the following error:
no instance(s) of type variable(s) U exist so that CompletableFuture<U> conforms to Double inference variable U has incompatible bounds: equality constraints: Double lower bounds: CompletableFuture<U81345>
I want getPrice
return CompletableFuture<Double>
but instead it returns CompletableFuture<CompletableFuture<Double>>
because I'm returning a value from a nested future. I could call .join()
on the nested future but I don't want to block the thread. This is my code:
package my.package;
import java.util.concurrent.CompletableFuture;
public class Test {
public CompletableFuture<String> getCar() {
return CompletableFuture.completedFuture("Ford");
}
public CompletableFuture<Integer> getCarMileage() {
return CompletableFuture.completedFuture(100000);
}
public CompletableFuture<Double> getPrice() {
return getCar()
.thenApplyAsync(car -> {
// do something
if (car.equals("Ford")) {
// do something
return getCarMileage()
.thenApplyAsync(mileage -> mileage * 0.2);
} else {
// do something
return CompletableFuture.completedFuture(42);
}
});
}
}
The operation you're looking for ("return a Container<U>
instead of plain U
") is normally called flatMap, but the Java CompletionStage
API uses other terms. As the API shows, thenApplyAsync
is supposed to take a T
and return a U
which will be wrapped into a CompletableFuture<U>
, but you can instead use thenComposeAsync
and return your CompletableFuture
(as a "flat" return type).