使用索引迭代IntStream

时间:2016-03-09 00:07:07

标签: java java-8 java-stream

是否可以使用IntStream但使用索引?

迭代int数组

尝试做这样的事情:

ByteBuf buf = ...;
int[] anArray = ...;

IntStream.of(anArray).forEach(...); // get index so I can do "anArray[index] = buf.x"

2 个答案:

答案 0 :(得分:5)

通常,使用Stream API修改源代码是个坏主意。 Stream API最适合处理不可变数据(因此创建新对象而不是改变现有数据)。如果要以某种方式使用索引填充数组来计算值,可以使用Arrays.setAll。例如:

int[] arr = new int[10];
Arrays.setAll(arr, i -> i*2);
// array is filled with [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] now

如果您仍想使用Stream API,则可以生成值流并将其转储到数组中(无需手动创建数组):

int[] arr = IntStream.range(0, 10).map(i -> i*2).toArray();

同样,您可以生成不依赖于索引的数组值。例如,来自随机生成器:

Random r = new Random();
int[] arr = IntStream.generate(() -> r.nextInt(1000)).limit(10).toArray();

虽然更好地使用Random类的专用方法:

int[] arr = new Random().ints(10, 0, 1000).toArray();

如果您只想创建一个填充相同值的数组,您也可以使用generate

int[] arr = IntStream.generate(() -> buf.x).limit(10).toArray();

尽管使用Arrays.fill,正如@FedericoPeraltaSchaffner所建议的那样,看起来更清晰。

答案 1 :(得分:4)

您不应该使用IntStream来改变数组。相反,请使用Arrays.fill()方法:

Arrays.fill(anArray, buf.x);