使用索引迭代IntStream

ImT*_*mRS 2 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"
Run Code Online (Sandbox Code Playgroud)

Tag*_*eev 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

int[] arr = new Random().ints(10, 0, 1000).toArray();
Run Code Online (Sandbox Code Playgroud)

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

int[] arr = IntStream.generate(() -> buf.x).limit(10).toArray();
Run Code Online (Sandbox Code Playgroud)

虽然Arrays.fill@FedericoPeraltaSchaffner建议使用它看起来更干净.