Java里面遍历list的方式| Java Debug 笔记

587 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接

问题:Java里面遍历list的方式

对于Java语言有点陌生,我尝试熟悉遍历list(或者其他集合)的所有方法(或者是其他正确的语法)和它们每一个方法的优缺点

给定 List的list对象,我知道有下列方法去循环所有的元素

基于循环的(当然这也等价于while/do while循环)

// 不推荐哈,看下面
for (int i = 0; i < list.size(); i++) {
    E element = list.get(i);
    // 1 - 可以调用元素的方法
    // 2 - 可以使用i去做一些基于下标的方法调用
    // ...
}

循环的增强版本 (很好地回答了这个问题)

for (E element : list) {
    // 1 - 调用元素的方法

    // ...
}

迭代器

for (Iterator<E> iter = list.iterator(); iter.hasNext(); ) {
    E element = iter.next();
    // 1 - 调用元素的方法
    // 2 - 可以用 iter.remove() 方法从list上移除当前元素

    // ...
}

List迭代器

for (ListIterator<E> iter = list.listIterator(); iter.hasNext(); ) {
    E element = iter.next();
    // 1 - 调用元素的方法
    // 2 - 可以用 iter.remove() 方法从list上移除当前元素
    // 3 - 可以用 iter.add(...) 在当前元素和下一个元素之间插入新元素
    // 4 -可以用iter.set(...) 取代当前元素

    // ...
}

Java函数

list.stream().map(e -> e + 1); // 可以对e用一个转换函数

Iterable.forEach, Stream.forEach, ...

(来自Java的stream API的映射方法 )

在Java8集合实现了 Iterable接口的类型(例如所有的list)里面,都要一个forEach的方法,可以代替上面的循环语句使用了(提供一个优秀的对比那就是另一个问题了)

Arrays.asList(1,2,3,4).forEach(System.out::println);
// 1 - 调用元素的方法
// 2 - 需要一个里面元素的引用用来移除它们
//   
// 3 - 从功能上分离迭代和发生在每一个元素上的行为

Arrays.asList(1,2,3,4).stream().forEach(System.out::println);
// Same capabilities as above plus potentially greater utilization of parallelism
//  实现相同的功能,上面的更加好,因为使用了并行
// 注意:因此,执行的顺序是不能保证的
// 想了解更多关于这个的请看 [Stream.forEachOrdered][stream-foreach-ordered] 

还有任何的其他方法吗? (顺便说一下,我不是对提升性能感兴趣。作为一个开发人员,我只是想知道什么方式是可用的而已)

回答

一种JDK8风格的迭代:

public class IterationDemo {

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3);
        list.stream().forEach(elem -> System.out.println("element " + elem));
    }
}

文章翻译自Stack Overflow:stackoverflow.com/questions/1…