直入主题:先看下相关接口及JDK给出的解释
Iterable接口:
//实现此接口允许对象成为“ for-each循环”语句的目标
public interface Iterable<T> {
//return an Iterator.
Iterator<T> iterator();
//给每个元素执行给定的操作,直到处理完所有元素或该操作引发异常为止。除非额外实现该方法
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
...
}
消费者:
//函数式接口
@FunctionalInterface
public interface Consumer<T> {
//对给定的参数执行此操作
void accept(T t);
...
}
迭代器:
public interface Iterator<E> {
//return true if the iteration has more elements
boolean hasNext();
//Returns the next element in the iteration
E next();
...
}
OK!,接口观察完毕,我们参照ArrayList对这三个接口的实现来定义一个我们的接口。
To do!
每个接口主要方法都需要主动实现
Consumer接口是函数接口,可以使用Lamda表达式
public class CollectionTest {
public static void main(String[] args) {
new myArray().forEach((t)->{
System.out.println(t);
});
//上面等同于下面
new myArray().forEach(
new Consumer() {
@Override
public void accept(Object o) {
System.out.println(o);
}
}
);
}
}
class myArray implements Iterable{
private int[] data = {1,2,3,4,5} ;
int size = data.length;
//需要自己实现
@Override
public Iterator iterator() {
return new myIterator();
}
//foreach的内部还是for循环
@Override
public void forEach(Consumer action) {
for (int d : data) {
action.accept(d);
}
}
//简单的下标检查+数值返回
private class myIterator implements Iterator{
int cursor = 0;
@Override
public boolean hasNext() {
return cursor!=size;
}
@Override
public Object next() {
return (int)data[cursor];
}
}
}