Java 8从输入构建IntStream的最佳方法

Rom*_*ard 6 lambda java-8 java-stream

我有输入(STDIN)

0 0 1 2 1

我想以最简单的方式从中创建一个流.

我通过逐个读取每个整数并将它们存储到ArrayList中来创建流.从那里我只需要使用.stream().reduce()来使它工作.

我想要的是一种直接从输入创建流的可能方法

我试图改编这段代码:

ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
IntStream is2 = IntStream.generate(inputStream::read).limit(inputStream.available());
Run Code Online (Sandbox Code Playgroud)

通过使用DataInputStream和readInt()方法

DataInputStream dis = new DataInputStream(System.in);
IntStream is2 = IntStream.generate(dis::readInt).limit(5);//later : dis.available() instead of 5
Run Code Online (Sandbox Code Playgroud)

但它不起作用我在生成函数上抛出不兼容的抛出类型IOException.

我可以做吗 ?或者是否有另一种方法将输入转换为流

我要应用的reduce函数是

reduce( (x , y) -> x ^ y) 
Run Code Online (Sandbox Code Playgroud)

我已经通过这样做很容易地在ArrayList上完成了这个

list.stream().reduce( (x , y) -> x ^ y);
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用扫描仪来完成这项工作,但没有成功,现在我设法让它工作

Scanner sc = new Scanner(System.in);
    int oi = Stream.of(sc.nextLine().split(" "))
                    .mapToInt(Integer::parseInt)
                    .reduce( (x , y) -> x ^ y).getAsInt();
    System.out.println(oi);
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它一开始不起作用

Rom*_*ard 2

解决方案

Scanner sc = new Scanner(System.in);
    int oi = Stream.of(sc.nextLine().split(" "))
                    .mapToInt(Integer::parseInt)
                    .reduce( (x , y) -> x ^ y).getAsInt();
    System.out.println(oi);
Run Code Online (Sandbox Code Playgroud)

  • 如果您的输入包含大量数字,则使用 `Pattern.compile(" ").splitAsStream( … )` 而不是 `Stream.of( … .split(" "))` 会更有效,因为前者不会收集所有匹配到一个临时数组。 (2认同)