有没有办法在Java 8中构建一个用索引迭代的forEach
方法?理想情况下,我喜欢这样的事情:
params.forEach((idx, e) -> query.bind(idx, e));
我现在能做的最好的事情是:
int idx = 0;
params.forEach(e -> {
query.bind(idx, e);
idx++;
});
答案 0 :(得分:131)
由于您正在迭代一个可索引的集合(列表等),我假设您可以只使用元素的索引进行迭代:
IntStream.range(0, params.size())
.forEach(idx ->
query.bind(
idx,
params.get(idx)
)
)
;
生成的代码类似于使用经典的i ++样式for循环迭代列表,除了更容易并行化(当然,假设对params的并发只读访问是安全的)。
答案 1 :(得分:54)
如果使用一个元素捕获包含当前索引的数组,则它与 params 一起使用。
int[] idx = { 0 };
params.forEach(e -> query.bind(idx[0]++, e));
上面的代码假定,方法 forEach 遍历遇到顺序的元素。除非另有说明,否则接口 Iterable 为所有类指定此行为。显然它适用于标准库中 Iterable 的所有实现,并且将来改变这种行为会破坏向后兼容性。
如果您使用 Streams 而不是集合 / Iterables ,则应使用 forEachOrdered ,因为< em> forEach 可以同时执行,元素可以按不同顺序发生。以下代码适用于顺序和并行流:
int[] idx = { 0 };
params.stream().forEachOrdered(e -> query.bind(idx[0]++, e));
答案 2 :(得分:27)
有一些解决方法,但没有干净/简短/甜蜜的方式来处理流,说实话,你可能会更好:
int idx = 0;
for (Param p : params) query.bind(idx++, p);