O Poder do Streams Java 8 ou Superior
- #Java
Pessoal queria compartilhar com vocês um pouco do meu conhecimento de Streams no Java.
Participei recentemente de um teste para emprego que pedia algo relacionado com CPFs e eu fiquei na duvida se teria uma base ou não dos cpf's e pensei em impressionar o contratante gerando meus CPFs aleatoriamente com streams uma vez que para gerar cpf tem varias ferramentas e códigos já prontos na internet.
Daí comecei a pensar em como fazer. Quando não usamos muito Streams é difícil começar a pensar e conhecer todas as funcionalidades. Mas cheguei a um código que me pareceu limpo e claro com Streams*****
Segue abaixo meu código, caso queiram comentar e melhorar fiquem a vontade, fico bem feliz se conseguirem melhorar meu código ou comentarem falhas, quero sempre crescer neste ponto.
Creio que impressiona muita gente quando trabalhamos com Streams.
import java.util.List;
import java.util.Random;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class generateCpf {
public static void main(String[] args) {
generate();
}
public static void generate() {
var randomNum = Stream.generate(() -> new Random().nextInt(10))
.limit(9).collect(Collectors.toList());
randomNum.add(calcDig1Stream(randomNum));
randomNum.add(calcDig2Stream(randomNum));
var newCpfGenerated = randomNum.
stream().
map(x-> x.toString()).
reduce((a,b)->a+b)
.orElse("").toString();
System.out.println(newCpfGenerated);
}
private static Integer calcDig1Stream(List<Integer> randomNum) {
AtomicReference<Integer> count = new AtomicReference<>(11);
var digIntermediateOne = randomNum.stream().map((n)->{
count.getAndSet(count.get() - 1);
return n*count.get();
}).reduce((a,b) -> a+b).orElse(0);
return (((digIntermediateOne % 11) <= 1) ? 0 : (11 - (digIntermediateOne % 11)));
}
private static Integer calcDig2Stream(List<Integer> randomNum) {
AtomicReference<Integer> count = new AtomicReference<>(12);
var digIntermediateOne = randomNum.stream().map((n)->{
count.getAndSet(count.get() - 1);
return n*count.get();
}).reduce((a,b) -> a+b).orElse(0);
return (((digIntermediateOne % 11) <= 1) ? 0 : (11 - (digIntermediateOne % 11)));
}
}
***** Claro desde que se tenha algum conhecimento com Streams
** Outro ponto, mas posso estar errado, é que este código ficou bem mais enxuto do que os que normalmente são encontrado na internet.