# 7.5实现Iterable接口

你还在使用如下的形式遍历元素么?

```java
for (int i = 0; i < linkedList.size(); i++) {
    System.out.println(linkedList.get(i));
}
```

每次遍历都一个姿势，要不解锁个如下新姿势吧。看起来代码更少，更优雅。

```java
for (String s : linkedList) {
    System.out.println(s);
}
```

## 实现步骤

1.自定义类实现Iterator接口

2.自定义类实现Iterable接口，并返回步骤一中的自定义Iterator类。

## 示例：包装链表类，实现Iterable接口

```java
public class LinkedList implements Iterable<Integer>{

    Node head;
    Node tail;

    public LinkedList(){
        head=null;
        tail=null;
    }

    public void add(int value){
        Node node =new Node(value);
        if(tail==null){
            head=node;
        }else{
            tail.setNext(node);
        }
        tail=node;
    }

    @Override
    public Iterator<Integer> iterator(){
        return new ListIterator(head);
    }


    class ListIterator implements Iterator<Integer>{

        Node currentNode;

        public ListIterator(Node head){
            currentNode=head;
        }

        @Override
        public boolean hasNext(){
            return currentNode!=null;
        }

        @Override
        public Integer next(){
            if (currentNode == null){
                throw new NoSuchElementException();
            }
            int value=conrrentNode.getValue();
            currentNode=currentNode.getNext();
            return value;
        }
    }

}
```

> 提示：面向接口编程时，请详细阅读接口注释。如在实现Iterator时，我们在注释中获取到hasNext()需返回true|false，next()方法无返回值时需返回NoSuchElementException等信息。

## 所感

* 阅读接口注释，严格按照合约来实现
* 为接口写注释，接口即合约。为接口写注释时，注释应详尽明了。注释信息包含功能、参数、返回值、异常、特殊情况等说明信息。
