xml地图|网站地图|网站标签 [设为首页] [加入收藏]
JAVA中的for-each循环与迭代
分类:网络频道

Java 经典实例:自定义迭代器,java经典实例

编写自己的Iterator,实现Iterator接口,这里多说一句,实现Iterable后,可以用“foreach”循环遍历你的对象。

import java.util.Iterator;
import java.util.NoSuchElementException;

/**
 * 演示Iterator和Iterable接口,并说明怎样编写一个用于对象数组的简单迭代器。
 */
public class AarrayIterator<T> implements Iterable<T>, Iterator<T> {
    private final static String[] names = {"rose", "petunia", "tulip"};

    public static void main(String[] args) {
        AarrayIterator<String> arrayIterator = new AarrayIterator<>(names);

        // Java 5,6的方式
        for (String s : arrayIterator) {
            System.out.println(s);
        }

        // Java 8的形式
        arrayIterator.forEach(System.out::println);
    }

    /**
     * 要遍历的数据
     **/
    protected T[] data;

    protected int index = 0;

    /**
     * 构造一个AarryIterator对象。
     *
     * @param data 被迭代的对象数组
     */
    public AarrayIterator(final T[] data) {
        setData(data);
    }

    /**
     * 设置(重置)数组为给定的数组,重置迭代器。
     * 参数d代表被迭代的数组对象。
     *
     * @param d 被迭代的数组对象
     */

    public void setData(final T[] d) {
        this.data = d;
        index = 0;
    }

    /**
     * 如果不是末尾,返回true,例如,if next()语句将成功执行。
     * 否则返回false,执行if next()语句会抛出异常。
     *
     * @return
     */
    public boolean hasNext() {
        return index < data.length;
    }

    /**
     * 返回该数据的下一个元素
     *
     * @return
     */
    public T next() {
        if (hasNext()) {
            return data[index++];
        }
        throw new NoSuchElementException("only " + data.length + " elements");
    }

    public void remove() {
        throw new UnsupportedOperationException("This demo Iterator does not implement the remove method");
    }

    /**
     * Iterator的方法
     *
     * @return
     */
    public Iterator<T> iterator() {
        index = 0;
        return this;
    }
}

执行结果:

rose
petunia
tulip
rose
petunia
tulip

 

http://www.bkjia.com/Javabc/1177470.htmlwww.bkjia.comtruehttp://www.bkjia.com/Javabc/1177470.htmlTechArticleJava 经典实例:自定义迭代器,java经典实例 编写自己的Iterator,实现Iterator接口,这里多说一句,实现Iterable后,可以用“foreach”循环遍历...

事实上,无需等到编译时才发现报错,eclipse会在这段代码写完之后就会在foreach循环处显示错误:Can only iterate over an array or an instance of java.lang.Iterable

1  public interface Iterator<E>{
2 
3  boolean hasNext();
4 
5  E next();
6 
7  void remove();
8  }
 1 import java.util.AbstractCollection;
 2 import java.util.ArrayList;
 3 import java.util.Iterator;
 4 
 5 public class ForeachTest {
 6     public static void main(String args[]) {
 7         CustomCollection<String> myCollection = new CustomCollection<String>();
 8         myCollection.add("Java");
 9         myCollection.add("Scala");
10         myCollection.add("Groovy");
11         for (String language : myCollection) {
12             System.out.println(language);
13         }
14     }
15 
16     private static class CustomCollection<T> extends AbstractCollection<T> {
17         private ArrayList<T> bucket;
18 
19         public CustomCollection() {
20             bucket = new ArrayList();
21         }
22 
23         public int size() {
24             return bucket.size();
25         }
26 
27         public boolean isEmpty() {
28             return bucket.isEmpty();
29         }
30 
31         public boolean contains(Object o) {
32             return bucket.contains(o);
33         }
34 
35         public boolean add(T e) {
36             return bucket.add(e);
37         }
38 
39         public boolean remove(Object o) {
40             return bucket.remove(o);
41         }
42 
43         @Override
44         public Iterator<T> iterator() {
45             // TODO Auto-generated method stub
46             return bucket.iterator();
47         }
48     }
49 }
  • 在遍历collection时,如果要在遍历期间修改collection,则必须通过Iterator/listIterator来实现,否则可能会发生“不确定的后果”。
  • foreach循环通过iterator实现,使用foreach循环的对象必须实现Iterable接口

 参考:Java for-each循环解惑

 

 1 import java.util.ArrayList;
 2 
 3 public class ForeachTest1 {
 4 
 5     public static void main(String args[]) {
 6         CustomCollection<String> myCollection = new CustomCollection<String>();
 7         myCollection.add("Java");
 8         myCollection.add("Scala");
 9         myCollection.add("Groovy");
10 
11         // What does this code will do, print language, throw exception or
12         // compile time error
13         for (String language : myCollection) {
14             System.out.println(language);
15         }
16     }
17 
18     private class CustomCollection<T> {
19         private ArrayList<T> bucket;
20 
21         public CustomCollection() {
22             bucket = new ArrayList();
23         }
24 
25         public int size() {
26             return bucket.size();
27         }
28 
29         public boolean isEmpty() {
30             return bucket.isEmpty();
31         }
32 
33         public boolean contains(T o) {
34             return bucket.contains(o);
35         }
36 
37         public boolean add(T e) {
38             return bucket.add(e);
39         }
40 
41         public boolean remove(T o) {
42             return bucket.remove(o);
43         }
44 
45     }
46 }

程序运行时所报异常:

二、for-each循环与迭代器Iterator<T>

 

总结:

查看Iterator接口API可以知道,这是对collection进行迭代的迭代器。迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的 collection 移除元素。 

 

 1 public class ItaratorTest {
 2 
 3     public static void main(String[] args) {
 4         Collection<String> list = new ArrayList<String>();
 5         list.add("Android");
 6         list.add("IOS");
 7         list.add("Windows Mobile");
 8 
 9         // example1
10         // Iterator<String> iterator = list.iterator();
11         // while (iterator.hasNext()) {
12         // String lang = iterator.next();
13         // list.remove(lang);
14         // }
15 
16         // example 2
17         for (String language : list) {
18             list.remove(language);
19         }
20     }
21 
22 }

接口:Iterator<T>

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
    at java.util.ArrayList$Itr.next(ArrayList.java:831)
    at Text.ItaratorTest.main(ItaratorTest.java:22)
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
    at java.util.ArrayList$Itr.next(ArrayList.java:831)
    at Text.ItaratorTest.main(ItaratorTest.java:17)

本文由宝马娱乐在线发布于网络频道,转载请注明出处:JAVA中的for-each循环与迭代

上一篇:java中File类的使用,javaFile类使用 下一篇:没有了
猜你喜欢
热门排行
精彩图文