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

Java 8 Best way to build an IntStream from input

我有输入 (STDIN)

0 0 1 2 1

我想以最简单的方式从中创建流。

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

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

我尝试修改这段代码:

ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
IntStream is2 = IntStream.generate(inputStream::read).limit(inputStream.available());

通过使用 DataInputStream 和 readInt() 方法

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

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

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

我要应用的reduce函数是

reduce( (x , y) -> x ^ y) 

我已经通过

在 ArrayList 上很容易地做到了这一点
list.stream().reduce( (x , y) -> x ^ y);

解决方案

我试过将它与扫描仪一起使用来完成这项工作,但没有成功,现在我设法让它工作了

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

一开始不明白为什么不行

解决方案

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

将 @Holger 推荐与 splitAsStream 一起使用而不是 Stream.of

int solution2 = Pattern.compile("\s+").splitAsStream(sc.nextLine())
                        .mapToInt(Integer::parseInt)
                        .reduce( (x , y) -> x ^ y).getAsInt();;
    System.out.println(solution2);