java - 实现迭代器设计模式
问题描述
我有一个班级 Example 女巫私人领域Hashmap<Integer, CustomObject>
。CustomObject
我的目标是使用接口访问此类中的所有实例Iterable
。首先,我声明 Example 来实现Iterable<CustomObject>
。然后我调用iterator()
方法。但是,我不知道是否应该指定hasNext()
等,在主代码中放入什么?这是我到目前为止所拥有的:
public class Example implements Iterable<Songs>{
private HashMap <Integer, CustomObject>;
@Override
public Iterator<CustomObject> iterator() {
for (CustomObject customObject: this){
System.out.println(customObject);
}
public static void main(String[] args) {
Example.iterator();
}
解决方案
实际上HashMap
有一个方法Map::values()
返回值的集合作为 aCollection<T>
实际上是-an Iterable<T>
(因此可以返回 an Iterator<T>
)。
Map<Integer, CustomObject> map = new HashMap<>();
Iterator<CustomObject> iterator = map.values().iterator();
此外,您的代码有几个错误:
private HashMap <Integer, CustomObject>;
错过了字段名称和可能的启动。- 实施
Iterable<Songs>
你必须覆盖public Iterator<CustomObject> iterator()
. 我假设你的意思是class Example implements Iterable<CustomObject>
。 Iterable::iterator
不是静态方法,所以你不能调用Example.iterator();
.
一个完整的例子,假设Example
是你的类中类似的可迭代委托HashMap map
(你忘记命名它,否则它不会编译和初始化它),那么你可以这样做:
public class Example implements Iterable<CustomObject> {
private Map<Integer, CustomObject> delegate = ...; // initialize + data
@Override
public Iterator<CustomObject> iterator() {
return this.delegate.values().iterator();
}
}
并像在任何这些片段中一样使用:
- 只要
Example
is-anIterable
,它就可以与增强循环一起使用:for (CustomObject customObject: new Example()) { // Iterable with enhanced loop System.out.println(customObject); }
- 通过实际
Iterator
:Iterator<CustomObject> iterator = new Example().iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); }
- 只要
Stream
每个Iterable
返回它的Spliterator
:StreamSupport.stream(new Example().spliterator(), false) .forEach(System.out::println);
推荐阅读
- reactjs - 如何在视图的表格中可视化firebase的文件存储内容?
- azure-cosmosdb - 租户太大,将其移动到不同的容器中?
- javascript - NodeJs 中回调参数的最佳实践
- c# - WCF Web.config 错误:“此集合已包含带有方案 http 的地址”
- mysql - AWS Cognito 对应用程序用户进行身份验证并从 MySQL 数据库中检索设置
- ios - Swift 中可解码的 DocumentReference
- bash - macOS find 命令行为异常
- angular - 复杂对象未完全在 api 调用中传递(Angular + net core 3)
- php - 在 Stripe PHP 上捕获特定错误以显示自定义消息
- php - Laravel 迁移数据库关系似乎是正确的。错误信息说外键不兼容