Estrutura while

Sintaxe de um while

A estrutura while é dada da forma:

while (condição) {
    // Sequência de comando
}

Bastante semelhante a um if, porém o if executa apenas uma vez, enquanto o while executa enquanto condição for true. É possível, por exemplo, fazer um while que executa eternamente entregando true como condição:

while (true) {
    System.out.println("Looooop!");
}

Geralmente, o objetivo é executar a sequência de comandos até que algo se torne falso. Por exemplo, o programa abaixo pede números ao usuário até que o número esteja dentro dos limites que o programa exige:

var console = System.console();

System.out.print("Insira um número de 0 a 10:");
var input = Integer.parseInt(console.readLine());

while (input > 10 || input < 0) {
    System.out.println("Número inválido! Ele deve ser de 0 a 10!");
    System.out.print("Insira um número de 0 a 10:");
    input = Integer.parseInt(console.readLine());
}

System.out.println("Número válido.");

Perceba que, diferente do for, não se tem a ideia de "N passos", mas sim de "até que X seja falso".

Exemplo de while: calcular raíz quadrada

Um exemplo envolvendo cálculo numérico é o de cálculo de raiz quadrada de x:

var x = 10.0;

var old = 0.0;
var guess = 100.0;  // can be any double != x

while (guess != old) {
    old = guess;
    guess = (guess + x / guess) / 2;
}

System.out.printf("Raiz de %f: %f\n", x, guess);

A técnica utilizada é a do Método de Newton para Cálculo de Raízes de Função, que consiste em ir de pouco em pouco convergindo para a raiz aproveitando a derivada da função (conceito visto em Cálculo) a cada passo. Não é importante aqui saber como o método funciona, mas sim prestar atenção em um detalhe: o objetivo não é executar N passos, mas sim continuar executando até que o valor de guess pare de mudar, e isso varia de x para x (alguns precisarão de mais passos, outros de menos).

Interrompendo estruturas de repetição

É possível parar a execução de uma estrutura de repetição utilizando o comando break:

while (true) {
    System.out.printf("Write \"end\" to quit: ");
    var input = System.console().readLine();

    if (input.equals("end")) {
        break;
    }
    System.out.println("Not quitting.");
}

System.out.println("The end.");

Nesse caso, a partir do momento que o usuário digitar "end", o break será executado e o while irá parar de executar (indo para o print de "The end.").