Java 8的forEach与索引

有没有办法在Java 8中build立一个迭代索引的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循环迭代列表,除了更容易的并行性(当然,假设并发只读params访问是安全的)。

它使用params如果你捕捉一个数组,包含当前索引的数组。

 int[] idx = { 0 }; params.forEach(e -> query.bind(idx[0]++, e)); 

上面的代码假定,每个方法遍历遇到顺序中的元素。 除非另有说明,否则Iterable接口将为所有类指定此行为。 显然,它适用于所有来自标准库的Iterable实现,并且在将来改变这种行为将会破坏向后兼容性。

如果您正在使用Streams而不是Collections / Iterables ,则应该使用forEachOrdered ,因为forEach可以同时执行,并且元素可以以不同的顺序出现。 以下代码适用于顺序和并行stream:

 int[] idx = { 0 }; params.stream().forEachOrdered(e -> query.bind(idx[0]++, e)); 

有解决方法,但没有干净/简短/甜美的方式来做到这一点溪stream,说实话,你可能会更好:

 int idx = 0; for (Param p : params) query.bind(idx++, p);