首页 > 解决方案 > 为什么标准的 Java 迭代器没有 peek()?

问题描述

基本 Java 迭代器被编程为没有像 peek() 这样的函数是否有任何特殊原因,它会在不推进迭代器的情况下返回下一个元素?

标签: javaiterator

解决方案


为什么标准的 Java 迭代器没有 peek()?

  1. 因为它不是通常描述的迭代器设计模式peek()的一部分。

  2. 因为绝大多数迭代器用例不需要它。强制所有实现(包括无数自定义/第 3 方类)实现不必要的方法将是一个坏主意。

  3. 因为该peek()方法对惰性数据源的迭代器的语义有潜在的影响。

  4. 因为peek()在某些情况下实现会影响迭代器的效率(内存、CPU)。无论您是否实际使用它。

  5. 因为peek()在一些晦涩的情况下会导致内存泄漏。

  6. 因为……

但归根结底,真正的原因是……因为他们在 2000 年左右就是这样设计的。当设计辩论发生时,我们不在房间里1

1 - 就其价值而言,似乎大多数其他2种语言对其标准迭代器 API 做出了相同的决定。Rust 似乎是个例外。请参阅https://doc.rust-lang.org/std/iter/struct.Peekable.html

2 - ...基于使用谷歌搜索的高度非科学的“调查”。


如果您想要一个也提供的迭代器抽象peek(),您可以扩展Iterator接口并自己实现迭代器。事实上,一个通用的迭代器可以很容易地实现为一个常规的Iterator.

或寻找第 3 方 API / 实现;例如GuavaApache Commons等。


推荐阅读