java源码品读(2)— Iterable

标签: java 源码 Iterable
16人阅读 评论(0) 收藏 举报
分类:

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

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

查看评论

for-each

for (iterable_type iterable_element : iterable) { }      从最低索引到最高索引遍历整个数组,迭代变量是只读的,对迭代变量的一次赋值不会影...
  • Peter_Ouyang
  • Peter_Ouyang
  • 2017年01月05日 23:38
  • 101

TypeError: 'NoneType' object is not iterable

今天在验证scrapy官网tutorial的例子时遇到了这个报错,例子的链接如下: https://docs.scrapy.org/en/latest/intro/tutorial.html exa...
  • jbhand
  • jbhand
  • 2017年09月09日 23:15
  • 1970

Java源码解析 Iterable<T>

位置:java.lang.Iterable 类型: interface 用途: 实现此接口 使对象成为"foreach" 语句的对象 参数: 是迭代器返回的元素类型 方法: me...
  • mingjie1212
  • mingjie1212
  • 2016年01月25日 22:07
  • 382

python 判断一个对象是可迭代对象collections模块的Iterable类型判断

>>> from collections import Iterable >>> isinstance('abc', Iterable) # str是否可迭代 True >>> isinstance(...
  • qq_39208536
  • qq_39208536
  • 2018年02月06日 17:29
  • 34

初学hadoop程序之---------------Iterable<T>迭代器

Java中迭代器的使用由于Java中数据容器众多,而对数据容器的操作在很多时候都具有极大的共性,于是Java采用了迭代器为各种容器提供公共的操作接口。使用Java的迭代器iterator可以使得对容器...
  • xin15200793067
  • xin15200793067
  • 2013年10月11日 19:35
  • 1989

Java8 Iterable接口源码阅读

/** * 实现这个接口允许对象成为for-each循环语句的目标 */ public interface Iterable { /** * 返回T类型的元素上的一个迭代器 ...
  • l294265421
  • l294265421
  • 2015年04月19日 18:49
  • 863

JS学习-iterable

1.1 iterable字面意思:可迭代的,可重复的 iterable是ES6标准引入的新的类型。而Array、Map和Set都属于iterable类型 1.2 为什么加入iterable类型?...
  • Mayerlucky
  • Mayerlucky
  • 2017年08月08日 13:01
  • 646

java基础巩固系列(九):持有对象之间的使用与关系(Iterable、Collection、List、Queue、Set、Map、Stack)

java中的持有对象之间的继承关系
  • u010800530
  • u010800530
  • 2015年01月17日 16:04
  • 1649

java集合中的Iterable接口的简介与运用

Iterable接口 (java.lang.Iterable) 是Java集合的顶级接口之一。Collection接口继承Iterable,所以Collection的所有子类也实现了Iterable接...
  • hgh813210
  • hgh813210
  • 2015年08月31日 15:31
  • 1917

Python中Iterable与Iterator

可迭代对象:Iterable 迭代器:Iterator 1、可迭代对象:Iterable 可以直接作用于 for 循环的数据类型有以下几种: 一类是集合数据类型,如list、tuple、dict...
  • m0_37843198
  • m0_37843198
  • 2017年04月24日 15:06
  • 375
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 960
    排名: 5万+
    博客专栏