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