這是我參與更文挑戰的第16天,活動詳情查看: 更文挑戰markdown
Java8爲Iterable接口新增了一個forEach(Consumer action)默認方法,該方法的參數是一個函數接口。而Iterable接口是Collection接口的父接口,所以Collection也能夠直接調用forEach方法。app
由於forEach(Consumer action)須要的是一個函數式接口,所以能夠用Lambda表達式來遍歷集合元素。以下例:函數
public class Test {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add(1);
c.add(2);
c.add(3);
c.add(4);
c.forEach(obj -> System.out.println(obj));
}
}
複製代碼
程序調用了Consumer中的惟一抽象方法accept(T t)。post
Iterator接口的對象也被稱爲迭代器。ui
Iterator接口中包含以下方法:url
boolean hasNext():若是迭代器中的集合元素還沒遍歷完,返回true
Object next():返回集合中的下一個元素
//查看該方法的源碼可知,next是從-1開始的,所以首次調用的時候返回的就是索引爲0的元素。
void remove():刪除集合裏上一次next方法返回的元素
void forEachRemaining(Consumer action):該方法使用Lambda表達式來遍歷集合元素
複製代碼
來看具體例子:spa
public class Test {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add(1);
c.add(2);
c.add(3);
c.add(4);
Iterator iter = c.iterator();
while(iter.hasNext()){
//next返回的元素是object類型,所以須要強制轉換
int num = (Integer) iter.next();
if(num==2){
iter.remove();
}
System.out.println(num);
}
System.out.println("刪除以後的集合是"+c);
}
}
複製代碼
使用Iterator中新增的forEachRemaining(Consumer action)來遍歷集合,此方法須要的參數也是一個函數式接口,所以能夠使用Lambda表達式。3d
來看具體例子:code
public class Test {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add(1);
c.add(2);
c.add(3);
c.add(4);
Iterator iter = c.iterator();
iter.forEachRemaining(obj -> System.out.println(obj));
}
}
複製代碼
foreach和Iterator接口相似,foreach中的循環變量也不是集合元素自己,而是集合元素的值。修改該值並不會影響集合元素。而且使用foreach時不能修改集合元素,不然會引發ConcurrentModinficationException異常。orm
來看具體例子:
public class Test {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add(1);
c.add(2);
c.add(3);
c.add(4);
for(Object i : c){
int num = (Integer)i;
System.out.println(num);
if(num==2){
//引發異常
c.remove(num);
}
}
}
}
複製代碼
以上就是我對Iterator接口的一些淺見,若有不足或錯誤之處,歡迎評論指正。