[英]Implementing iterator design pattern
我有一个类 Example 女巫私有字段Hashmap<Integer, CustomObject>
。 我的目标是使用Iterable
接口访问CustomObject
中的所有CustomObject
实例。 首先,我声明 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()
将值的集合作为Collection<T>
,它实际上是一个Iterable<T>
(因此可以返回一个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();
}
}
并在以下任何片段中使用 like:
Example
是一个Iterable
,那么它就可以与增强循环一起使用: 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()); }
Iterable
返回其Spliterator
通过Stream
: StreamSupport.stream(new Example().spliterator(), false) .forEach(System.out::println);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.