1

遇到该问题的背景:

  • Spark1.6运行时,返回Iterable的情况,如返回reslist;
  • 到了Spark2.0+需要返回Iterator(),如返回reslist.iterator()。
  • 借此机会,这里对Iteratable和Iterator接口做进一步了解。

首先要说明的是,迭代器要集合类库,需要Iterable和Iterator:

1.Iterable接口

  • 内置了iterator方法顺序遍历数据源返回值Iterator接口
  • jdk8增加了forEach方法返回void
  • jdk8增加了spliterator方法实现并行遍历数据源返回Spliterator接口,底层是Stream并行遍历(Stream.isParallel())的实现:这里涉及到trySplit()分割n次,数据源就被分成了2^n块
  • Set、List都要实现Iterable接口,基本上使用迭代器都要实现该接口

以下是Iterable的定义:

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

Java基本数据类型包含8种:

  • 6种数字类型(4个整型long-64位/int-32位/short-16位/byte-8位、2个浮点型double-64位/float-32位)
  • 字符型char-16位
  • 布尔型boolean

Iterator和ListIterator主要区别有:

  • ListIterator有add()方法,可以向List中添加对象;而Iterator不能
  • ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历。ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。
  • ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator 没有此功能。
  • 都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。因为ListIterator的这些功能,可以实现对LinkedList等List数据结构的操作。

2.Iterator接口

  • 出现 Iterator 是为了解决遍历集合时,避免我们在操作集合的时候必须要根据集合内部结构来选择我们应该如何遍历,因此把Iterator抽象出来

以下是Iterator的定义:

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

Java类库:
是由一些包组成,这些包包含了相关类、接口和异常处理类

  • Java核心包:以Java开头,包含:java.lang 编程语言的基本类库、java.applet、java.awt、java.io、java.net、java.util 集合类+时间处理模式+日期时间工具等各类常用工具包、java.sql、java.test、java.security、java.beans、java.math、java.rmi
  • Java扩展包:以javax开头,包含:javax.accessibility、javax.naming.*、javax.swing.*

Java集合类库:

  • List和Set都是实现Collection接口(Collection实现了Iteratable接口),Map不是
  • List:LinkedList链表结构、ArrayList动态再分配的数组、Vector~Stack是同步的(同时操作回出现修改异常)
  • Set:HashSet默认大小是16、TreeSet有序
  • Map:Hashtable(通过初始容量和加载因子来调整性能)、HashMap允许Key为空、TreeMap有序

个人理解:

  • 随着Spark的升级,很多方法直接返回Iterator即可。这里面会涉及到Spark的多个算子的返回类型变化
  • Iterable是java的超级接口,Iterable里面的Iterator()返回的是Iterator。

时光格
0 声望2 粉丝