Java 8 forEach with index
有没有办法在Java 8中构建一个用索引迭代的方法?理想情况下,我想要这样的东西:forEach
params.forEach((idx, e) -> query.bind(idx, e));
我现在能做的最好的事情是:
int idx = 0;
params.forEach(e -> {
query.bind(idx, e);
idx++;
});
有没有办法在Java 8中构建一个用索引迭代的方法?理想情况下,我想要这样的东西:forEach
params.forEach((idx, e) -> query.bind(idx, e));
我现在能做的最好的事情是:
int idx = 0;
params.forEach(e -> {
query.bind(idx, e);
idx++;
});
由于您正在迭代可索引集合(列表等),因此我认为您可以仅使用元素的索引进行迭代:
IntStream.range(0, params.size())
.forEach(idx ->
query.bind(
idx,
params.get(idx)
)
)
;
生成的代码类似于使用经典的 i++ 样式 for 循环迭代列表,只是具有更简单的并行化性(当然,假设对参数的并发只读访问是安全的)。
如果您捕获具有一个包含当前索引的元素的数组,则它适用于参数。
int[] idx = { 0 };
params.forEach(e -> query.bind(idx[0]++, e));
上面的代码假定 forEach 方法按遇到顺序循环访问元素。接口 Iterable 为所有类指定此行为,除非另有说明。显然,它适用于标准库中的所有 Iterable 实现,将来更改此行为会破坏向后兼容性。
如果您使用的是 Streams 而不是 Collections/Iterables,则应使用 forEachOrdered,因为 forEach 可以同时执行,并且元素可以以不同的顺序出现。以下代码适用于顺序流和并行流:
int[] idx = { 0 };
params.stream().forEachOrdered(e -> query.bind(idx[0]++, e));