博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
迭代器
阅读量:6591 次
发布时间:2019-06-24

本文共 5142 字,大约阅读时间需要 17 分钟。

Iterable 接口

Iterable 接口,表示可迭代的能力。实现接口,可用foreach 进行迭代。 foreach迭代编译器会转换为iterator迭代

public interface Iterable
{ // 返回一个迭代器 Iterator
iterator(); default void forEach(Consumer
action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } } default Spliterator
spliterator() { return Spliterators.spliteratorUnknownSize(iterator(), 0); }}复制代码

Iterator

public interface Iterator
{ boolean hasNext(); E next(); default void remove() { throw new UnsupportedOperationException("remove"); } default void forEachRemaining(Consumer
action) { Objects.requireNonNull(action); while (hasNext()) action.accept(next()); }}复制代码

使用

ArrayList
intList = new ArrayList<>();intList.add(123);intList.add(456);Iterator
iterator = intList.iterator();while (iterator.hasNext()){ log.info(iterator.next());}复制代码

ListIterator

public interface ListIterator
extends Iterator
{ boolean hasNext(); E next(); boolean hasPrevious(); E previous(); int nextIndex(); int previousIndex(); void remove(); void set(E e); void add(E e);}复制代码

迭代时插入和删除

只能用 iterator 对象的 add 和 remove 方法

// 向前遍历ListIterator
iterator = intList.listIterator(intList.size());while (iterator.hasPrevious()){ if (iterator.previous()<200) { iterator.remove(); }}log.info(intList);复制代码

实现

public class ArrayList
extends AbstractList
implements List
, RandomAccess, Cloneable, java.io.Serializable { public Iterator
iterator() { return new Itr(); } // 内部类 private class Itr implements Iterator
{ int cursor; // index of next element to return int lastRet = -1; // index of last element returned; -1 if no such int expectedModCount = modCount; public boolean hasNext() { return cursor != size; } @SuppressWarnings("unchecked") public E next() { checkForComodification(); int i = cursor; if (i >= size) throw new NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) throw new ConcurrentModificationException(); cursor = i + 1; return (E) elementData[lastRet = i]; } public void remove() { if (lastRet < 0) throw new IllegalStateException(); checkForComodification(); try { ArrayList.this.remove(lastRet); cursor = lastRet; lastRet = -1; expectedModCount = modCount; } catch (IndexOutOfBoundsException ex) { throw new ConcurrentModificationException(); } } @Override @SuppressWarnings("unchecked") public void forEachRemaining(Consumer
consumer) { Objects.requireNonNull(consumer); final int size = ArrayList.this.size; int i = cursor; if (i >= size) { return; } final Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) { throw new ConcurrentModificationException(); } while (i != size && modCount == expectedModCount) { consumer.accept((E) elementData[i++]); } // update once at end of iteration to reduce heap write traffic cursor = i; lastRet = i - 1; checkForComodification(); } final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); } } private class ListItr extends Itr implements ListIterator
{ ListItr(int index) { super(); cursor = index; } public boolean hasPrevious() { return cursor != 0; } public int nextIndex() { return cursor; } public int previousIndex() { return cursor - 1; } @SuppressWarnings("unchecked") public E previous() { checkForComodification(); int i = cursor - 1; if (i < 0) throw new NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) throw new ConcurrentModificationException(); cursor = i; return (E) elementData[lastRet = i]; } public void set(E e) { if (lastRet < 0) throw new IllegalStateException(); checkForComodification(); try { ArrayList.this.set(lastRet, e); } catch (IndexOutOfBoundsException ex) { throw new ConcurrentModificationException(); } } public void add(E e) { checkForComodification(); try { int i = cursor; ArrayList.this.add(i, e); cursor = i + 1; lastRet = -1; expectedModCount = modCount; } catch (IndexOutOfBoundsException ex) { throw new ConcurrentModificationException(); } } }}复制代码

: 迭代器表示的是一种关注点分离的思想,将数据的实际组织方式和数据的迭代遍历相分离,是一种常见的设计模式。

转载地址:http://chkio.baihongyu.com/

你可能感兴趣的文章
边缘计算架构增强数据中心—雾计算、边缘计算正蓬勃兴起
查看>>
将线下场景搬到线上,青牛软件发布视频呼叫中心产品
查看>>
国内航空业大数据新应用:星环助力厦门航空
查看>>
httpoxy漏洞远程攻击PHP Python应用
查看>>
解读非法泄露的数据和隐私的流入路径
查看>>
ImageMagick再爆DoS漏洞CVE-2017-8830 7.0.5及7.0.6版本受影响 波及多个Ubuntu Linux版本
查看>>
近几年前端技术盘点以及 2016 年技术发展方向
查看>>
RedHat Linux服务器安全配置细节
查看>>
大数据架构面临技术集成的巨大障碍
查看>>
智能中控:让“各自为政”的智能家居并肩作战
查看>>
安卓耗电之谜:罪魁祸首是谁?
查看>>
剖析大数据分析方法论的几种理论模型
查看>>
选择外部数据中心:云安全十问
查看>>
TalkingData携手中青旅联科建立旅游消费者大数据实验室
查看>>
APP推广之巧用工具进行数据分析
查看>>
你如何在浏览器中体验Ubuntu
查看>>
一分钟了解负载均衡的一切
查看>>
小鱼易连全系新品正式发布 引爆音视频会议行业核聚变
查看>>
认知计算可改进企业的13个关键功能
查看>>
大数据科技如何影响现代体育
查看>>