首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中迭代列表的方法?

在Java中迭代列表的方法?

提问于 2017-12-22 09:35:29
回答 2关注 0查看 436

对于Java语言来说,我尝试熟悉所有的方法,以便可以遍历列表以及每个方法的优缺点。

给定一个List<E> list对象,我知道以下方法遍历所有元素:

基本的 循环(当然,也有相同的while/ do while循环)

代码语言:txt
复制
代码语言:txt
复制
// Not recommended (see below)!
代码语言:txt
复制
for (int i = 0; i < list.size(); i++) {
代码语言:txt
复制
    E element = list.get(i);
代码语言:txt
复制
    // 1 - can call methods of element
代码语言:txt
复制
    // 2 - can use i to make index-based calls to methods of list
代码语言:txt
复制
代码语言:txt
复制
    // ...
代码语言:txt
复制
}

注意:这个形式对于迭代Lists来说是一个糟糕的选择,因为这个get方法的实际实现可能不如使用一个方法的效率Iterator。例如,LinkedList实现必须遍历i之前的所有元素才能获得第i个元素。在上面的例子中,List实现没有办法“保存它的位置”,以使未来的迭代更有效率。对于一个ArrayList它并不重要,因为复杂性/成本get是恒定的时间(O(1)),而对于一个LinkedList是成正比的列表(O(n))的大小。

增强for循环(在这个问题很好地解释)

代码语言:txt
复制
for (E element : list) {
代码语言:txt
复制
    // 1 - can call methods of element
代码语言:txt
复制
代码语言:txt
复制
    // ...
代码语言:txt
复制
}

迭代器

代码语言:txt
复制
代码语言:txt
复制
for (Iterator<E> iter = list.iterator(); iter.hasNext(); ) {
代码语言:txt
复制
    E element = iter.next();
代码语言:txt
复制
    // 1 - can call methods of element
代码语言:txt
复制
    // 2 - can use iter.remove() to remove the current element from the list
代码语言:txt
复制
代码语言:txt
复制
    // ...
代码语言:txt
复制
}

编辑:添加ListIterato

的ListIterato

代码语言:txt
复制
代码语言:txt
复制
for (ListIterator<E> iter = list.listIterator(); iter.hasNext(); ) {
代码语言:txt
复制
    E element = iter.next();
代码语言:txt
复制
    // 1 - can call methods of element
代码语言:txt
复制
    // 2 - can use iter.remove() to remove the current element from the list
代码语言:txt
复制
    // 3 - can use iter.add(...) to insert a new element into the list
代码语言:txt
复制
    //     between element and iter->next()
代码语言:txt
复制
    // 4 - can use iter.set(...) to replace the current element
代码语言:txt
复制
代码语言:txt
复制
    // ...
代码语言:txt
复制
}

编辑:添加“功能风格”的解决方案

功能性的Java

代码语言:txt
复制
list.stream().map(e -> e + 1); // can apply a transformation function for e

编辑:添加从Java 8的Stream API的地图方法

代码语言:txt
复制
Iterable.forEach,Stream.forEach,...

在实现的Java 8集合类Iterable(例如所有Lists)中,现在有一个forEach方法,可以用来代替上面演示的for循环语句。(

代码语言:txt
复制
Arrays.asList(1,2,3,4).forEach(System.out::println);
代码语言:txt
复制
// 1 - can call methods of an element
代码语言:txt
复制
// 2 - would need reference to containing object to remove an item
代码语言:txt
复制
//     (TODO: someone please confirm / deny this)
代码语言:txt
复制
// 3 - functionally separates iteration from the action
代码语言:txt
复制
//     being performed with each item.
代码语言:txt
复制
代码语言:txt
复制
Arrays.asList(1,2,3,4).stream().forEach(System.out::println);
代码语言:txt
复制
// same capabilities as above plus potentially greate
代码语言:txt
复制
// utilization of parallelism
代码语言:txt
复制
// (caution: consequently, order of execution is not guaranteed,
代码语言:txt
复制
// see [Stream.forEachOrdered][stream-foreach-ordered] for more
代码语言:txt
复制
// information about this.)

还有什么其他的方式,如果有的话?

相关文章

相似问题

相关问答用户
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档