image

Acesse bootcamps ilimitados e +650 cursos pra sempre

60
%OFF
Article image
Adriano Menezes
Adriano Menezes13/04/2023 19:41
Compartilhe

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.

Compartilhe
Comentários (0)