问题: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:https://stackoverflow.com/questions/18410035/ways-to-iterate-over-a-list-in-java