Java foreach循环:for(整数i:列表){…}

当我使用JDK5时如下

ArrayList list = new ArrayList(); for (Integer i : list) { //cannot check if already reached last item } 

另一方面,如果我只使用Iterator

 ArrayList list = new ArrayList(); for (Iterator i = list.iterator(); i.hasNext();) { //i can check whether this is last item if(i.hasNextItem()){ } } 

如何检查我是否已经使用for (Integer i : list) {到达最后一项for (Integer i : list) {

一种方法是使用计数器:

 ArrayList list = new ArrayList(); ... int size = list.size(); for (Integer i : list) { ... if (--size == 0) { // Last item. ... } } 

编辑

无论如何,正如Tom Hawtin所说,当你需要通过使用for循环或iterator来获取当前索引信息时,使用“旧”语法有时会更好,因为在使用Java5语法时你赢得的一切都会丢失循环本身……

 for (int i = 0; i < list.size(); i++) { ... if (i == (list.size() - 1)) { // Last item... } } 

要么

 for (Iterator it = list.iterator(); it.hasNext(); ) { ... if (!it.hasNext()) { // Last item... } } 

有时候使用迭代器会更好。

(据称,对于posh for循环中的索引的“85%”请求是用于实现String连接方法(您可以轻松地进行)。)

API不直接支持。 您可以使用for(int i ..)循环并计算元素或使用子列表(0,size – 1)并显式处理最后一个元素:

  if(x.isEmpty()) return; int last = x.size() - 1; for(Integer i : x.subList(0, last)) out.println(i); out.println("last " + x.get(last)); 

这仅在不引入冗余时才有用。 它的性能优于计数版本(在子列表开销分摊后)。 (以防你无论如何都要关心拳击)。

另一种方法是,您可以使用传递对象捕获最后一个值,然后使用它执行某些操作:

 List list = new ArrayList(); Integer lastValue = null; for (Integer i : list) { // do stuff lastValue = i; } // do stuff with last value