我有一堆返回 CompletableFuture 的方法,我想以特定的方式链接
package com.sandbox;
import java.util.Random;
import java.util.concurrent.CompletableFuture;
import java.util.stream.IntStream;
public class SandboxFutures {
public CompletableFuture<Integer> generateRandom(int min, int max) {
return CompletableFuture.supplyAsync(() -> {
if (min >= max) {
throw new IllegalArgumentException("max must be greater than min");
}
Random r = new Random();
return r.nextInt((max - min) + 1) + min;
});
}
public CompletableFuture<String> printEvenOrOdd(int result) {
return CompletableFuture.supplyAsync(() -> {
if (result % 2 == 0)
return "Even";
else
return "Odd";
});
}
public CompletableFuture<Integer> findFactorial(int evenNumber) {
return CompletableFuture.supplyAsync(() -> {
if (evenNumber <= 0) {
return 0;
}
return IntStream.rangeClosed(2, evenNumber).reduce(1, (x,y) -> x*y);
});
}
public CompletableFuture<Integer> convertToNearestEvenInteger(int oddNumber) {
return CompletableFuture.supplyAsync(() -> {
if (oddNumber <= 0) {
return 2;
}
return oddNumber+1;
});
}
}
我尝试根据以下规则将它们组合起来,
- 生成 1 到 100 之间的随机数
- 如果是偶数则打印
Even
,如果是奇数则打印Odd
- 如果数字是偶数,则使用随机数调用
findFactorial
- 如果数字是奇数,则通过
convertToNearestEvenInteger
找到最接近的偶数
我不太清楚如何进行条件链接和异常处理。一些示例或代码片段可能会有所帮助。
最佳答案
您可以使用thenCompose()
:
CompletableFuture<Integer> n = generateRandom(1, 100)
.thenCompose(i -> printEvenOrOdd(i)
.thenCompose(s -> s.equals("Even")
? findFactorial(i)
: convertToNearestEvenInteger(i)));
System.out.println(n.get());
但是,当生成大偶数时,您的阶乘方法无法存储大于 int
的任何数字,因此您需要更新它。
关于java - 根据条件链接可完成的 future,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55056706/