1. foreach , 其实质是调用的collection的迭代器接口 , 所有 , 如果需要自定义容器的遍历规则 , 需要继承迭代器并重写迭代器接口
package sky.java.interable;
import java.util.Iterator;
/**
 * 模拟容器子类,实现迭代器接口,使用foreach遍历
 */
public class MyIterableClass implements Iterable<String>{
    private String[] arr = "321 534 23423 321".split(" ");
    @Override
    public Iterator<String> iterator() {
        return new Iterator<String>() {
            private int size = 0;
            @Override
            public void remove() {
            }
            @Override
            public boolean hasNext() {
                return size < arr.length;
            }
            @Override
            public String next() {
                return arr[size++];
            }
        };
    }
    /**
     * 收获
     *  1. foreach循环底层依赖的是 集合类的迭代器.
     *  2. 如果想让某各类能够使用foreach循环 , 让该类实现Iterable接口,重写方法即可.
     *  3. 数组是不可以的.
     */
    public static void main(String[] args) {
        MyIterableClass myIterableClass = new MyIterableClass();
        for (String s : myIterableClass) {
            System.out.println(s);
        }
    }
}
  1. 自定义List的适配器, 对list进行包装. 使其按照其他规则遍历
package sky.java.interable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
/**
 * array子类,扩展其迭代器的功能,倒序遍历
 * foreach的实质: 调用迭代器的迭代方法,进行遍历 , 新增Iterable遍历方式
 * @param <T>
 */
public class ArrayReverseClass<T> extends ArrayList<T>{
    public ArrayReverseClass(Collection<T> c) {
        super(c);
    }
    public Iterable<T> reversed() {
        return new Iterable<T>() {
            @Override
            public Iterator<T> iterator() {
                return new Iterator<T>() {
                    int current = size()-1;
                    @Override
                    public boolean hasNext() {
                        return current > -1;
                    }
                    @Override
                    public T next() {
                        return get(current--);
                    }
                    @Override
                    public void remove() {
                    }
                };
            }
        };
    }
    public static void main(String[] args) {
        ArrayReverseClass<String> arrayReverseClass = new ArrayReverseClass(Arrays.asList("1 2 3 4 5 6 ".split(" ")));
        // for(A a : 迭代器子类)
        for (String  s : arrayReverseClass.reversed()) {
            System.out.println(s);
        }
    }
}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐