java源码品读(2)— Iterable

版权声明:转载的话请注明原文章地址,谢谢 https://blog.csdn.net/m0_37664906/article/details/79962403

在java中,日常运用比较多的就是各式各样处理数据的集合类,近段时间的java源码品读会更多地从这方面的源码读起。
说起集合,大家可能首先会想到的是用的比较多的list和map,而他们有一个共同的父接口Iterable,在1.8中Iterable接口中又为我们带来了一些新的东西,经过这两天的了解也算是略知一二,在这里写一写,如果有写错的地方还望大佬指出。

Iterable接口是从jdk1.5才有的新接口,也正是有了这个接口,我们在书写代码的时候才有了更为简单的集合遍历方式:”for-each loop”

  • Iterator<T> iterator()

1.8之前的版本中Iterable接口中只有一个方法

    /**
     * Returns an iterator over a set of elements of type T.
     *
     * @return an Iterator.
     */
    Iterator<T> iterator();

iterator()方法返回一个集合元素类型的迭代器,以方便我们进行集合的循环遍历。

  • default void forEach(Consumer<? super T> action)
    1.8之后的版本中,Iterable中又出现了两个新的方法,其一:
default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

首先,关于default,可以看这篇文章:java8默认方法
其次,forEach方法为我们的循环遍历提供了一种新的思路,即接受一个Consumer类型的动作指令来完成循环遍历的实行,这遍是1.8中比较强大的lambda表达式,允许我们使用函数表达式的形式进行java代码的开发,这里只说跟我们的foreach相关的东西,稍后会对lambda做一些系统的整理,当然这是后话,我们先来看对于foreach循环遍历lambda带给我们的不同:

//这是我们之前的foreach循环的写法,
for (iterable_type iterable_element : iterable) {
    System.out.println(iterable_element);       
}

//1.8之后可以这样写
iterable.forEach(iterable_element -> System.out.println(iterable_element));

//或者这样
iterable.forEach(System.out::println);

代码的量似乎要少一些,从文字的形象度而言更好理解一些,不过这种方式感觉如果不熟练的话还是慎用,会带来一些不必要的烦恼- -。

  • default Spliterator<T> spliterator()
    第二个便是这个spliterator方法
default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }

方法为我们返回了一个默认的可分割迭代器,作者也在方法的文档注释中有解释说这个方法,默认的分割迭代器只具有小的可怜的能力,所以继承接口的类总应该去重写这个方法以提供一种更好的实现。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页