看书了半天,个人浅显的认为迭代器模式就是实现了一个迭代器。
class MyIter{
private List<Object> ob = new ArrayList<>();
private int i = 0;
public boolean hasnext(){
if (i < ob.size()){
return true;
}else{
return false;
}
}
public Object get(){
if (hasnext()){
return ob.get(i++);
}else{
return null;
}
}
}
但是Java里面有个Iterable和Iterator的接口
Iterator使用例子:
源码:
package java.util;
import java.util.function.Consumer;
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class App {
public static void main(final String[] args) throws Exception {
List<Object> ob = new ArrayList<>();
ob.add("1");
ob.add("2");
ob.add("3");
ob.add("4");
Iterator myiterator = new MyIterator(ob);
while (myiterator.hasNext()){
System.out.println(myiterator.next());
}
}
}
class MyIterator implements Iterator {
private List<Object> ob = new ArrayList<>();
private int i = 0;
MyIterator(List<Object> ob){
this.ob = ob;
}
@Override
public boolean hasNext() {
if (i < ob.size()){
return true;
}else{
return false;
}
}
@Override
public Object next() {
if (hasNext()){
return ob.get(i++);
}else{
return null;
}
}
}
/*
结果
1
2
3
4
*/
Iterable使用例子:
源码:
import java.util.Iterator;
import java.util.Objects;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.Consumer;
public interface Iterable<T> {
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
import java.util.Iterator;
import java.util.ArrayList;
import java.util.List;
public class App {
public static void main(final String[] args) throws Exception {
List<Object> ob = new ArrayList<>();
ob.add("1");
ob.add("2");
ob.add("3");
ob.add("4");
Iterable myiterable = new MyIterable(ob);
Iterator myiterator = myiterable.iterator();
while (myiterator.hasNext()){
System.out.println(myiterator.next());
}
}
}
class MyIterable implements Iterable {
private List<Object> ob = new ArrayList<>();
private int i = 0;
MyIterable(List<Object> ob){
this.ob = ob;
}
@Override
public Iterator iterator() {
// TODO Auto-generated method stub
return new MyIterator();
}
private class MyIterator implements Iterator{
@Override
public boolean hasNext() {
if (i < ob.size()){
return true;
}else{
return false;
}
}
@Override
public Object next() {
if (hasNext()){
return ob.get(i++);
}else{
return null;
}
}
}
}
/*
结果
1
2
3
4
*/
区别:既然已经可以直接实现Iterator接口的类,何苦要折腾一个Iterable接口的类?
MyIterable类它能返回一个MyIterator类的对象。若有很多个Iterator接口的类,且迭代方法各不相同怎么办?
我只用修改MyIterable中返回的Iterator对象就可以了。即保证了客户端调用同样的接口可以实现不同的迭代方法。
神奇的是Iterable接口不用导入,Iterator的接口要导入