Encadenamiento de futuros completables basados ​​en condiciones

Estoy teniendo un montón de métodos que devuelven un CompletableFuture y me gustaría encadenar de una manera específica

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;
        });
    }

}

Estoy tratando de combinarlos según las siguientes reglas,

  1. Genera un número aleatorio entre 1 y 100
  2. Si el número es par Even, si es imparOdd
  3. Si el número es incluso llame al findFactorialcon el número aleatorio
  4. Si el número es impar, encuentre el par más cercano a través de convertToNearestEvenInteger

No tengo muy claro cómo hacer el encadenamiento condicional y el manejo de excepciones. Algunos ejemplos o fragmentos de código pueden ser útiles.

Respuesta 1

La forma en que printEvenOrOddestá escrita hace que sea más difícil de lo necesario. El problema es que no imprime la palabra "Par" o "Impar", la devuelve , lo que significa que resultse perdió el original . El resto de los pasos se basan en tener el número real. Para evitarlo, puede usar llamar printEvenOrOddy usar .thenApply(__ -> result)para restaurar el número original después. Se vería así:

System.out.println(
    generateRandom(1, 100)
        .thenCompose(result ->
            printEvenOrOdd(result)
                .thenAccept(System.out::println)
                .thenApply(__ -> result)
        )
        .thenCompose(result ->
            result % 2 == 0
                ? findFactorial(result)
                : convertToNearestEvenInteger(result)
        )
        .join()
);

Una mejor solución sería cambiar la definición de printEvenOrOddalgo como:

public CompletableFuture<Integer> printEvenOrOdd(int result) {
    return CompletableFuture.supplyAsync(() -> {
        System.out.println(result % 2 == 0 ? "Even" : "Odd");
        return result;
    });
}

Eso facilitaría mucho encadenar los pasos 3 y 4:

System.out.println(
    generateRandom(1, 100)
        .thenApply(this::printEvenOrOdd)
        .thenCompose(result ->
            result % 2 == 0
                ? findFactorial(result)
                : convertToNearestEvenInteger(result)
        )
        .join()
);
Respuesta: 2

Estoy tratando de buscar usuarios almacenados en mi base de datos de Firebase por nombre de usuario con una barra de búsqueda simple (EditText) y cuando se hace clic en un botón para mostrar ese usuario en particular, tengo el siguiente código ...

import java.util.Scanner; public class Array1 {public static void main (String [] args) {Scanner input = new Scanner (System.in); int [] valores = {1, 2, 3, 4, 5}; Sistema....

Sin usar matrices y métodos especiales, como el método de división, ¿cómo escribo el siguiente método? La entrada int representa un número n que se supone positivo, y la cadena de salida contiene ...

Soy nuevo en Java y necesito tu ayuda para implementar una GUI. A continuación se muestra un código de juego de adivinanzas. Funciona. import javax.swing. *; import java.awt. *; import java.awt.event.ActionEvent; importar java ....