問題: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