• Iterable接口


    Iterable接口

    总览

    这个接口用来表明可以进行迭代。具体的迭代方式,可以通过iterator()方法获取到一个迭代器,在迭代器中会实现如何获取下一个元素,以及是否迭代结束。

    java8中源码如下:

    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);
        }
    }
     

    可以看到在接口中主要有3个方法

    1. Iterator iterator(); 用来返回一个 Iterator
    2. forEach, 存在一个默认实现,很明显可以看到就是用来遍历Iterable中的所有元素
    3. spliterator, 返回来返回一个Spliterator, 用来表明如何对元素进行分割

    Iterable 和 Iterator

    从字面意思来看: Iterable 具有迭代能力的; Iterator 迭代器 Iterable的派生类都是具有迭代能力的,具有迭代能力的前提是,需要实现一个Iterator对象来表明如何进行迭代。

    为什么将Iterable和Iterator分开

    1. 可以很明显的预测到,集合类会作为参数,在各个方法中进行传递。如果在集合类中耦合迭代器,那么在各个方法中进行遍历的时候,都会对迭代器的位置信息进行修改。当后续进行使用的时候,会不清楚当前迭代器的位置在哪里,则每次使用之前,需要reset一下位置,然后才敢继续使用。
    2. 所以将两者分离的好处就提现出来了,每次从集合类中获取Iterator的时候,集合类new一个新的Iterator返回,每次都是从初始位置开始。

    forEach 方法

    default void forEach(Consumer<? super T> action) {
            Objects.requireNonNull(action);
            for (T t : this) {
                action.accept(t);
            }
        }
     

    Java8中新增的方式,方法前面加了default 表明这是一个默认方法,关于默认方法,可以看这篇文章.

    方法的内容很简单,遍历每一个元素,对每个元素执行传入的操作。  注意一点: 如果在执行传入操作的时候,抛异常了,那么会中端遍历的执行。

    Spliterator接口

    • 参考文章1文章2
    • Spliterator接口是用来明确以何种方式将集合分割成多个小集合的,分割成小集合的目的是为了进行并行计算
    • 看一下Spliterator接口
    public interface Spliterator<T> {
    
        boolean tryAdvance(Consumer<? super T> action);
    
        default void forEachRemaining(Consumer<? super T> action) {
            do { } while (tryAdvance(action));
        }
    
        Spliterator<T> trySplit();
    
        long estimateSize();
    
        default long getExactSizeIfKnown() {
            return (characteristics() & SIZED) == 0 ? -1L : estimateSize();
        }
    
        int characteristics();
    
        default boolean hasCharacteristics(int characteristics) {
            return (characteristics() & characteristics) == characteristics;
        }
    
        default Comparator<? super T> getComparator() {
            throw new IllegalStateException();
        }
    
        public static final int ORDERED    = 0x00000010;
        public static final int DISTINCT   = 0x00000001;
        public static final int SORTED     = 0x00000004;
        public static final int SIZED      = 0x00000040;
        public static final int NONNULL    = 0x00000100;
        public static final int IMMUTABLE  = 0x00000400;
        public static final int CONCURRENT = 0x00001000;
        public static final int SUBSIZED = 0x00004000;
    
    }

    其中比较重要的是trySplit方法,用来表明如何进行分割。

     
  • 相关阅读:
    【WEBAPI】Passing multiple POST parameters to Web API Controller Methods
    【WEBAPI】常用参数传递方法总结
    JavaScript面向对象静态方法私有方法公有方法特权方法
    javascript 封装
    javascript 获取 浏览器body高宽
    Fiddler 教程
    预加载下一张图片
    div页面居中
    关于模块化加载
    chrome本地不能操作iframe
  • 原文地址:https://www.cnblogs.com/cyttina/p/7441140.html
Copyright © 2020-2023  润新知