Iterable和iterator java
Iterable定义了一个接口,表示该对象是能够用来遍历的,而实现该接口的类要返回一个iterator,来具体的实现遍历. ide
实现了Iterable接口的类能够和foreach配合使用.若是没有应用泛型的話,iterator返回的是object,须要类型转化. code
应用 对象
1.为咱们本身的class建立多个iterator 接口
public class GameCollection { private Vector<Game> games; private Vector<GameConsole> consoles; private class Games implements Iterable<Game> { @Override public Iterator<Game> iterator() { return games.iterator(); } } private class Consoles implements Iterable<GameConsole> { @Override public Iterator<GameConsole> iterator() { return consoles.iterator(); } } public GameCollection() { games = new Vector<Game>(); consoles = new Vector<GameConsole>(); } public void add(Game game) { games.add(game); } public void add(GameConsole console) { consoles.add(console); } public Games games() { return new Games(); } public Consoles consoles() { return new Consoles(); } }
GameCollection gc = new GameCollection(); //Add games and consoles with gc.add() for (Game g : gc.games()) { System.out.println(g.getName()); } for (GameConsole g : gc.consoles()) { System.out.println(g.getName()); }
2.建立本身的iterator element
public class CircularGamesIterator implements Iterator<Game> { private Vector<Game> list; private int currentPosition; public CircularGamesIterator(Vector<Game> games) { list = games; currentPosition = 0; } @Override public boolean hasNext() { return currentPosition < list.size(); } @Override public Game next() { Game el = list.elementAt(currentPosition); currentPosition = (currentPosition + 1) % list.size(); return el; } @Override public void remove() { } }
public class GameCollection implements Iterable<Game> { private Vector<Game> games; public GameCollection() { games = new Vector<Game>(); } public void add(Game game) { games.add(game); } @Override public Iterator<Game> iterator() { return new CircularGamesIterator(games); } }