Java中的迭代器指南

Java中的迭代器指南

1.简介

一个迭代器是许多方面,我们可以遍历集合一体,成为每一个选项,它有它的优点和缺点。

它首先在Java 1.2中引入,作为Enumerations的替代品,并且:

  • 引入改进的方法名称
  • 使我们可以从我们正在迭代的集合中删除元素
  • 不保证迭代顺序

在本教程中,我们将回顾简单的Iterator接口,以了解如何使用其不同的方法。

我们还将检查更强大的ListIterator扩展,它增加了一些有趣的功能。

2. 迭代器接口

首先,我们需要从Collection中获取Iterator ; 这是通过调用iterator()方法完成的。

为简单起见,我们将从列表中获取Iterator实例:

List<String> items = ...
Iterator<String> iter = items.iterator();

该迭代器接口有三个核心方法:

2.1 hasNext()

的hasNext()方法可用于检查是否有至少一个元件左遍历。

它被设计用作while循环中的条件:

while (iter.hasNext()) {
    // ...
}

2.2 next()

的next()方法可用于跨过的下一个元素并且获得它:

String next = iter.next();

这是很好的做法是使用hasNext()试图调用之前的next() 。

迭代器的收藏不以任何特定的顺序保证迭代,除非特定的实现提供了它。

2.3 remove()

最后,如果我们想要从集合中删除当前元素,我们可以使用remove:
···
iter.remove();
···
这是一种在迭代集合时删除元素的安全方法,没有ConcurrentModificationException的风险。

2.4 完整的 迭代器示例

现在我们可以将它们全部组合起来,看看我们如何将这三种方法一起用于集合过滤:

while (iter.hasNext()) {
    String next = iter.next();
    System.out.println(next);
    if( "TWO".equals(next)) {
        iter.remove();              
    }
}

这就是我们通常使用Iterator的方法,我们提前检查是否有其他元素,我们检索它然后我们对它执行一些操作。

2.5 使用Lambda表达式进行迭代

正如我们在前面的例子中看到的那样,当我们想要遍历所有元素并对它们做一些事情时,使用Iterator非常冗长。

从Java 8开始,我们有了forEachRemaining方法,允许使用lambdas来处理剩余的元素:

iter.forEachRemaining(System.out::println);

3. ListIterator接口

ListIterator是一个扩展,它添加了迭代列表的新功能:

ListIterator<String> listIterator = items.listIterator(items.size());

注意我们如何提供一个起始位置,在这种情况下是List的结尾。

3.1 hasPrevious()和previous()

ListIterator可用于反向遍历,因此它提供了hasNext()和next()的等价物:

while(listIterator.hasPrevious()) {
    String previous = listIterator.previous();
}

3.2 nextIndex()和previousIndex()

另外,我们可以遍历索引而不是实际元素:

String nextWithIndex = items.get(listIterator.nextIndex());
String previousWithIndex = items.get(listIterator.previousIndex());

如果我们需要知道我们当前正在修改的对象的索引,或者我们想要保留已删除元素的记录,这可能非常有用。

3.3 add()

该插件的方法,其中,顾名思义,可以让我们增加一个元素将被返回的项目之前的next()和返回的一个后前一个():

listIterator.add("FOUR");

3.4 set()

值得一提的最后一个方法是set(),它允许我们替换在next()或previous()调用中返回的元素:

String next = listIterator.next();
if( "ONE".equals(next)) {
    listIterator.set("SWAPPED");
}

重要的是要注意,只有先前没有调用add()或remove()时才能执行此操作。

3.5 完整的ListIterator示例

我们现在可以将它们组合起来做一个完整的例子:

ListIterator<String> listIterator = items.listIterator();
while(listIterator.hasNext()) {
    String nextWithIndex = items.get(listIterator.nextIndex());     
    String next = listIterator.next();
    if("REPLACE ME".equals(next)) {
        listIterator.set("REPLACED");
    }
}
listIterator.add("NEW");
while(listIterator.hasPrevious()) {
    String previousWithIndex
     = items.get(listIterator.previousIndex());
    String previous = listIterator.previous();
    System.out.println(previous);
}

在这个例子中,我们首先从List获取ListIterator,然后我们可以通过索引获得下一个元素 - 它不会增加迭代器的内部当前元素 - 或者通过调用next。

然后我们可以用set替换特定项,并使用add插入一个新项。

在到达迭代结束后,我们可以返回修改其他元素或只是从下到上打印它们。

4 结论

该迭代器接口允许我们在遍历它,这是比较困难的一个简单的/ while语句修改的集合。反过来,这为我们提供了一个很好的模式,我们可以在许多方法中使用这些模式,只需要集合处理,同时保持良好的内聚力和低耦合。

Java中的迭代器指南

微信关注:JAVA知己,每天更新。

JAVA知己
Java中的迭代器指南