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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With