首页 > 解决方案 > 获取用户输入值并使用 java 中的 Streams 处理它们

问题描述

下面的代码在给定的用户输入中找到数字 5 的位置。有没有一种方法可以通过延迟评估使用 java 8 Streams 编写以下代码,而无需将数据存储在内存中。

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);

     }
}

标签: javajava-8java-streamuser-input

解决方案


TL;DR:不要使用迭代方法优越的流。

虽然可以做到,但这种转换要么效率低下,要么相当棘手,而且无论如何都会破坏流的目的。您的代码中有两个点,这使得这里的迭代方法比流式传输更可取:

  • 你改变一个状态变量count,而流函数最好是无状态的

  • 您使用break它是为了过早地完成迭代,而流通常在处理完所有元素之前不会完成。

过早地脱离流是可能的,但这很棘手。也可以通过将输入的每个标记与其序列号配对来避免改变外部变量,但生成的代码将更慢且更难阅读。

代码可能如下所示的示例:

System.out.println(new BufferedReader(new InputStreamReader(System.in)).lines()
    .mapToInt(Integer::valueOf)
    .takeWhile(number -> number != 5)
    .count() + 1);

推荐阅读