Tenho estudado os cursos da Alura, e os exercícios são sempre bons e simples de entender. Contudo, eu sempre me deparava com os mesmos tipos de escopo de código. O que quero dizer com "escopo" é que todos os códigos sempre seguem o mesmo modelo padrão, por exemplo:
For
for (i = args; condition; increment) { lógica }
While
while (condition) { lógica }
Ou outras estruturas um pouco mais "avançadas", como conversão de tipos — passar String para Number (int, float, double, long) — exigem o uso de tipos wrapper para realizar a conversão:
Integer.parseInt(value) // pode ser um Scanner ou String
Double.parseDouble(value)
Ainda assim, não há garantia de segurança na hora da conversão de tipos, pois posso acabar passando um valor de tipo incorreto, o que pode causar um IllegalArgumentException ou outra exceção.
Foi pensando nisso que utilizei o que aprendi — e ainda estou aprendendo — para criar esta API que visa simplificar essas questões: desde formatação de código, uso de regex e placeholders, conversão de tipos (de String para Number, de Object para Number, de String para boolean), até controle de fluxo de dados, facilitando o uso de estruturas como for, while, do-while, if e else. Utilizando tipos genéricos para proporcionar maior flexibilidade e Optionals para tratamento de retorno (callback), prevenindo NullPointerException.
Link para o repositório da API JToolBox
Assim ficou o código do desafio:
Contagem de degraus
package com.github.rickmvi.challenge01;
import java.util.Scanner;
public class StepCount {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter the amount of steps: ");
        int steps = scanner.nextInt();
        for (int i = 1; i <= steps; i++) {
            System.out.printf("Climbing step: %d%n", i);
        }
        System.out.print("You arrived at the top");
        scanner.close();
    }
}
Aqui usando minha API:
Repeat
package com.github.rickmvi.challenge01;
import com.github.rickmvi.jtoolbox.console.Out;
import com.github.rickmvi.jtoolbox.console.ScannerUtils;
import com.github.rickmvi.jtoolbox.control.Iteration;
public class SCFlowRepeat {
    public static void main(String[] args) {
        ScannerUtils.init();
        Out.printLine("Enter the amount of steps: ");
        int steps = ScannerUtils.nextInt();
        Iteration.repeat(steps, i -> {
            Out.printFormatted("Climbing step: {}%n", i + 1);
        });
        Out.print("You arrived at the top");
        ScannerUtils.close();
    }
}
WhileTrue
package com.github.rickmvi.challenge01;
import com.github.rickmvi.jtoolbox.console.Out;
import com.github.rickmvi.jtoolbox.console.ScannerUtils;
import com.github.rickmvi.jtoolbox.control.While;
import java.util.concurrent.atomic.AtomicInteger;
public class SCFlowWhileTrue {
    public static void main(String[] args) {
        ScannerUtils.init();
        AtomicInteger i = new AtomicInteger(1);
        Out.printLine("Enter the amount of steps: ");
        int steps = ScannerUtils.nextInt();
        While.whileTrue(() -> i.get() <= steps, () -> {
            Out.printFormatted("Climbing step: {}%n", i.get());
            i.incrementAndGet();
        });
        Out.print("You arrived at the top");
        ScannerUtils.close();
    }
}
 
             
            