java - 根据条件链接可完成的 future

标签 java asynchronous exception completable-future conditional-execution

我有一堆返回 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. 生成 1 到 100 之间的随机数
  2. 如果是偶数则打印Even,如果是奇数则打印Odd
  3. 如果数字是偶数,则使用随机数调用 findFactorial
  4. 如果数字是奇数,则通过 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/

相关文章:

java - 从 main 方法中的类访问包含变量的非静态方法?

javascript - 如何等待一组异步回调函数?

node.js - Mocha,如何在没有UnhandledPromiseRejectionWarning的情况下测试异步代码

c++ - 如何猜测libpqxx C++库函数抛出的异常类型?

java - Android 应用程序中 keystore 中的空别名列表

java - 如何使用 Jackson yaml 以大括号 ([ ]) 格式将 Java 列表打印到 Yaml 列表

javascript - 如何从异步调用返回响应?

Android SQLite 数据库 database/data/data/... (conn# 0) 已经关闭

ios - 当点击 NSSetUncaughtExceptionHandler 时,使用 CoreGraphics 在屏幕上绘制

java - 在java中提取没有对象的JSON内容