Analise o código a seguir.IntStream.iterate(2, x -> x <...
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
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
oufalse
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