import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.UnaryOperator;

public class DemoFunzioni {
    static int fattoriale(int n) {
        if (n < 0) {
            throw new IllegalArgumentException("n negativo");
        }
        if (n == 0) {
            return 1;
        }
        return Math.multiplyExact(n, fattoriale(n - 1));
    }

    public static void main(String[] args) {
        Function<String, String> pulisci = String::strip;
        UnaryOperator<String> maiuscolo = String::toUpperCase;
        Function<String, String> prepara = pulisci.andThen(maiuscolo);
        Predicate<String> nonVuoto = testo -> !testo.isBlank();
        BiConsumer<String, Integer> stampa =
                (testo, lunghezza) -> System.out.println(testo + ": " + lunghezza);

        int lunghezzaMinima = 3;
        for (String originale : List.of("  Java  ", " ", " Go ")) {
            String testo = prepara.apply(originale);
            if (nonVuoto.test(testo) && testo.length() >= lunghezzaMinima) {
                stampa.accept(testo, testo.length());
            }
        }
        System.out.println(fattoriale(5));
    }
}
