java - 为什么标准的 Java 迭代器没有 peek()?
问题描述
基本 Java 迭代器被编程为没有像 peek() 这样的函数是否有任何特殊原因,它会在不推进迭代器的情况下返回下一个元素?
解决方案
为什么标准的 Java 迭代器没有 peek()?
因为它不是通常描述的迭代器设计模式
peek()
的一部分。因为绝大多数迭代器用例不需要它。强制所有实现(包括无数自定义/第 3 方类)实现不必要的方法将是一个坏主意。
因为该
peek()
方法对惰性数据源的迭代器的语义有潜在的影响。因为
peek()
在某些情况下实现会影响迭代器的效率(内存、CPU)。无论您是否实际使用它。因为
peek()
在一些晦涩的情况下会导致内存泄漏。因为……吻。
但归根结底,真正的原因是……因为他们在 2000 年左右就是这样设计的。当设计辩论发生时,我们不在房间里1。
1 - 就其价值而言,似乎大多数其他2种语言对其标准迭代器 API 做出了相同的决定。Rust 似乎是个例外。请参阅https://doc.rust-lang.org/std/iter/struct.Peekable.html。
2 - ...基于使用谷歌搜索的高度非科学的“调查”。
如果您想要一个也提供的迭代器抽象peek()
,您可以扩展Iterator
接口并自己实现迭代器。事实上,一个通用的迭代器可以很容易地实现为一个常规的Iterator
.
或寻找第 3 方 API / 实现;例如Guava、Apache Commons等。
推荐阅读
- c - 如何连接 MATLAB 和 React?
- java - 无法从 JSON 转换;意外字符('f'(代码 102)):在(字符串)“5f19a7e99933db43cb23e83d”处的根级值之间需要空格分隔
- html - 如果图像不是特定大小,如何在 CSS 中使用背景颜色?
- apache2 - 如何修复 Apache WSGI 上的 FastAPI 应用程序错误?
- python - Matplotlib 在带阴影的表面上绘制 3d 线
- android - 清除 TextView 的文本后,HorizontalScrollView 保持可滚动状态
- c - 静态链接到 C 程序的 Rust 代码是否因此获得任何有益的安全属性?
- arduino - Arduino Mega 上的这个芯片叫什么名字?我没有找到它的数据表 56 TI MSP?
- go - 创建 Couchbase 的动态 n1ql 查询,但它没有返回记录并优雅退出而没有任何错误
- django - Elastic Beanstalk Aws Django 静态和媒体文件