是否可以使用IntStream
但使用索引?
尝试做这样的事情:
ByteBuf buf = ...;
int[] anArray = ...;
IntStream.of(anArray).forEach(...); // get index so I can do "anArray[index] = buf.x"
答案 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);