使用扫描仪创建流

时间:2015-12-03 18:21:51

标签: arrays java-8 java.util.scanner java-stream

这通常是我接受用户Array的方式。我要求大小,然后循环并填充Array

Scanner scan = new Scanner(System.in);
int N = scan.nextInt();
int[] numbers = new int[N];
for (int n=0; n<N; n++){
    numbers[n] = scan.nextInt();
}

我一直在努力学习java 8,我注意到Random类现在有一个创建流的方法。现在很容易用随机数声明一个n大小的数组。

int[] randomNumbers = new Random().ints().limit(N).toArray();

我一直在尝试创建一个数组,使用stream或lambda表达式执行类似的操作,但是用户输入。我尝试做的是创建IntStream,将值映射到Scanner#nextInt,然后创建一个数组。

int[] numbers = new IntStream().map(x -> scan.nextInt()).limit(N).toArray();

可以做的事情是这样的:

int[] numbers = new int[N];
Arrays.fill(numbers, 0);
numbers = Arrays.stream(numbers).map(x -> scan.nextInt()).toArray();
System.out.println(Arrays.toString(numbers));

但这仍然有点多余。用一些任意数字填充数组只是为了在下一行中替换它。

2 个答案:

答案 0 :(得分:3)

使用IntStream.generate

int[] numbers = IntStream.generate(() -> scan.nextInt()).limit(N).toArray();

如评论中所提到的,这会生成无序流。如果您想订购,可以使用:

IntStream.range(0, N).map(i -> scan.nextInt()).toArray();

答案 1 :(得分:3)

由于way, the current implementation handles limit(…)s,使用以下方法创建流更有效:

IntStream.range(0, N).map(i -> scan.nextInt())

使用toArray()以及并行处理时效率更高,尽管使用range操作创建了一个未使用的值。此外,这会创建一个ordered stream maintains the element order

所以在使用时,

int[] numbers = IntStream.range(0, N).map(i -> scan.nextInt()).toArray();

它可以提前了解数组大小。