Возьмите пользовательские значения ввода и обработайте их, используя Streams в java - PullRequest
0 голосов
/ 15 марта 2020

Код ниже находит позицию числа 5 в данных ввода пользователя. Есть ли способ, которым я могу написать приведенный ниже код, используя java 8 потоков через ленивый анализ и без сохранения данных в памяти.

public class HelloWorld{

     public static void main(String []args){
        Scanner s=new Scanner(System.in);
        int count=0;

        while(s.hasNextInt()){
            count++;
            if(s.nextInt()==5){
                break;
            }
        }
        System.out.println(count);

     }
}

1 Ответ

3 голосов
/ 15 марта 2020

TL; DR : не использовать потоки, в которых итеративный подход лучше.

Хотя это можно сделать, такое преобразование будет либо неэффективным, либо довольно сложным, и в любом случае победит цель потока. В вашем коде есть две точки, поэтому итеративный подход здесь предпочтительнее потоковой передачи:

  • вы изменяете переменную состояния count, в то время как функции потока должны быть предпочтительно без состояния

  • вы используете break для преждевременного завершения итерации sh, в то время как потоки обычно не заканчиваются sh до тех пор, пока не будут обработаны все элементы.

Можно оторваться от потоков преждевременно, но это сложно . Также возможно избежать изменения внешней переменной, связав каждый токен ввода с его порядковым номером, но полученный код будет медленнее и сложнее для чтения.

Пример того, как код может выглядеть:

System.out.println(new BufferedReader(new InputStreamReader(System.in)).lines()
    .mapToInt(Integer::valueOf)
    .takeWhile(number -> number != 5)
    .count() + 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...