Analise o código a seguir.IntStream.iterate(2, x -> x &lt...

Próximas questões
Com base no mesmo assunto
Q873500 Programação

Analise o código a seguir.


IntStream.iterate(2, x -> x < 20, x -> x * 2).forEach(System.out::print)


Em uma máquina que tem instalado o JAVA 9, esse código

Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

Alternativa correta: A - não compila.

O código apresentado é uma tentativa de utilizar recursos do Java, mais especificamente da API de Streams, para gerar e operar sobre uma sequência de números inteiros. No entanto, há um erro no código que impede sua compilação.

A função IntStream.iterate foi estendida no Java 9 para aceitar um predicado como segundo argumento, que determina quando a iteração deve parar. A forma correta dessa sobrecarga é iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next), onde:

  • seed: é o elemento inicial da iteração,
  • hasNext: é o predicado que retorna true ou false para determinar se a iteração deve continuar,
  • next: é uma função que produz o próximo elemento com base no anterior.

Contudo, o código da questão possui um erro sintático: falta uma vírgula após o parâmetro x -> x < 20, fazendo com que o compilador Java interprete incorretamente os argumentos do método iterate. O código correto deveria ser:

IntStream.iterate(2, x -> x < 20, x -> x * 2).forEach(System.out::print);

Sem a vírgula correta, o compilador não consegue entender a divisão dos argumentos e, consequentemente, não compila o código. Portanto, a alternativa A é a correta porque o código, como está apresentado na questão, contém um erro que impede sua compilação.

Ao corrigir o erro de sintaxe e executar o código, ele imprime uma sequência de potências de 2 começando em 2 e indo até que o resultado seja menor que 20. Mas é importante notar que, sem a correção, o código não chega a ser executado.

Clique para visualizar este gabarito

Visualize o gabarito desta questão clicando no botão abaixo

Comentários

Veja os comentários dos nossos alunos

Alguém sabe o erro?

LETRA A

Errei a questão e confesso que tive que pesquisar bastante para entender, se você tiver conhecimento prévio de expressões Lambda e Method Reference já ajuda demais.

Mas vamos ao que interessa:

IntStream é uma interface: IntStream é um fluxo de valores int primitivos. Faz parte do pacote java.util.stream, e você pode encontrar muitas das mesmas funções que no Stream <T> normal. Também existem streams para lidar com primitivos double e long.- Fonte(http://www.deadcoderising.com/2015-05-19-java-8-replace-traditional-for-loops-with-intstreams/)

iterate é um Método Estático, na documentação da Oracle o iterate recebe apenas 2 PARÂMETROS, o que de cara nos permite reconhecer o erro da questão: static IntStream iterate(int seed, IntUnaryOperator f).

O Código que compilou no meu PC

IntStream
          .iterate(2, n-> n*2)
          .filter(n -> n > 0 && n < 20) 
          .forEach(System.out::println);

------
          .iterate(2, n-> n*2) -> Seed é o valor original de N - UnaryOperator é a operação que será aplica em cima de N
          .filter(n -> n > 0 && n < 20) -> filter significa uma condição de filtro para parar o laço(Tentei colocar o filter só com 'n<20' mas não deu certo). Achei algumas fontes falando que atualmente existe o método takeWhile(ConditionalOperator co), que nos permitiria usar somente 'n<20', porém não consegui usá-lo, provavelmente por que não atualizei o meu java.

Desculpem-me se houver algum erro ou a implementação estiver um pouco porca, mas foi o conhecimento que consegui formular para poder responder essa questão. Quem puder adicionar mais cometários com certeza ajudará muito!

Fontes:
https://stackoverflow.com/questions/40358827/intstream-iterate-in-steps
https://docs.oracle.com/javase/8/docs/api/java/util/stream/IntStream.html
https://docs.oracle.com/javase/8/docs/api/java/util/stream/IntStream.html#iterate-int-java.util.function.IntUnaryOperator-
http://www.deadcoderising.com/2015-05-19-java-8-replace-traditional-for-loops-with-intstreams/

Letra A. Não compila pois falta o ";" ao final da expressão. Lembrando que no JAVA 9 o IntStream.iterate pode receber 2 ou 3 parâmetros. Se tivesse o ";" ao final do código ele copilaria e mostraria "24816" no console.

 

https://stackoverflow.com/questions/40358827/intstream-iterate-in-steps

Não achei "24816", então marquei que não compila.

Clique para visualizar este comentário

Visualize os comentários desta questão clicando no botão abaixo