java iterable和iterator_Java中Iterable和Iterator接口

接口定义

public interface Iterable {

Iterator iterator();

}

public interface Iterator {

boolean hasNext();

E next();

void remove();

}

Iterable只是返回了Iterator接口的一个实例,这里很是奇怪,为什么不把两个接口合二为一,直接在Iterable里面定义hasNext(),next()等方法呢?

原因是实现了Iterable的类可以在实现多个Iterator内部类,例如LinkedList中的ListItr和DescendingIterator两个内部类,就分别实现了双向遍历和逆序遍历。通过返回不同的Iterator实现不同的遍历方式,这样更加灵活。如果把两个接口合并,就没法返回不同的Iterator实现类了。

上个代码,直观地展示一下实现了Iterable的类如何通过返回不同的Iterator从而实现不同的遍历方式。MutilIterator实现了三种迭代器,分别是默认的前向迭代器,反向迭代器和随机迭代器。主函数中分别调用了三种迭代器进行遍历。

代码示例

MutilIterator.java

import java.util.*;

public class MutilIterator implements Iterable {

private String[] words = "May I get offers this summer.".split(" ");

//默认的迭代器,前向遍历

public Iterator iterator() {

//匿名内部类

return new Iterator() {

private int index = 0;

public boolean hasNext() {return index < words.length;}

public String next() { return words[index++]; }

public void remove() { // Not implemented

throw new UnsupportedOperationException();

}

};

}

//反向迭代器

public Iterable reverseIterator() {

return new Iterable() {

@Override

public Iterator iterator() {

return new Iterator() {

private int index = words.length - 1;

public boolean hasNext() {return index > -1; }

public String next() {return words[index--]; }

public void remove() { // Not implemented

throw new UnsupportedOperationException();

}

};

}

};

}

//随机迭代器,注意这里不是创建一个新的Iterator,而是返回了一个打乱的List中的迭代器

public Iterable randomized() {

return new Iterable() {

public Iterator iterator() {

List shuffled = new ArrayList<>(Arrays.asList(words));

Collections.shuffle(shuffled, new Random(47));

return shuffled.iterator();

}

};

}

public static void main(String[] args) {

MutilIterator mi = new MutilIterator();

//默认的迭代器

for (String String : mi) {

System.out.print(String + " ");

}

System.out.println();

//反向迭代器

for (String String : mi.reverseIterator()) {

System.out.print(String + " ");

}

System.out.println();

//随机迭代器

for (String String : mi.randomized()) {

System.out.print(String + " ");

}

}/*Output:

May I get offers this summer.

summer. this offers get I May

I this offers summer. May get

*///

结论:

Java容器中,所有的Collection子类会实现Iteratable接口以实现foreach功能,Iteratable接口的实现又依赖于实现了Iterator的内部类(参照LinkedList中listIterator()和descendingIterator()的JDK源码)。有的容器类会有多个实现Iterator接口的内部类,通过返回不同的迭代器实现不同的迭代方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值